上一篇:由浅入深,走进Python装饰器-----第四篇:进阶--函数装饰类


类装饰器

@类类

4.1 用类装饰器来扩展原类( 增加属性和方法 )

# 用类装饰器来扩展原函数,  通过对象函数化触发__call__方法,进行返回class KuoZhan():    def __call__(self,cls):        return self.newfunc(cls)    def good(self):        print("新增的方法!")    def newfunc(self,cls):        def in_newfunc():             cls.addpty = "新增的属性"            cls.good = KuoZhan.good            # 此处返回的是一个实例化对象            return cls()        return in_newfunc@KuoZhan()        #1.  KuoZhan() ==> obj    2. @KuoZhan()==> @obj  ==>  obj( )   3.  @KuoZhan() == obj( MyClass), ,触发__call__ ,得到 in_newfuncclass MyClass():    def func(self):        print("我是原类的方法")# MyClass实际就是in_newfunc, MyClass() == in_newfunc() , 所以 obj = cls()# 对象调用方式obj = MyClass() obj.func()obj.good()print(obj.addpty)>>>我是原类的方法>>>新增的方法啦!>>>新增的属性

4.1.2 用带参数的类装饰器来扩展原类( 增加属性和方法 )

# 用带参数类装饰器扩展原函数,  通过对象函数化触发__call__方法,进行返回class KuoZhan():    # 带参数的装饰器,等于实例化对象,触发__init__,传递参数    def __init__(self,num):        self.num = num    def __call__(self,cls):        if self.num == 1:            return self.newfunc(cls)        else:            return self.newfunc2(cls)    def good(self):        print("新增的方法!")    def newfunc(self,cls):        def in_newfunc():             cls.addpty = "新增的属性"            cls.good = KuoZhan.good            # 此处返回的是一个实例化对象            return cls()        return in_newfunc    def newfunc2(self,cls):        pass@KuoZhan(1)        #1.  KuoZhan() ==> obj    2. @KuoZhan()==> @obj  ==>  obj( )   3.  @KuoZhan() == obj( MyClass), ,触发__call__ ,得到 in_newfuncclass MyClass():    def func(self):        print("我是原类的方法")# MyClass实际就是in_newfunc, MyClass() == in_newfunc() , 所以 obj = cls()# 对象调用方式obj = MyClass() obj.func()obj.good()print(obj.addpty)>>>我是原类的方法>>>新增的方法啦!>>>新增的属性

4.2 用类装饰器来扩展原类( 增加属性和方法 )

# 用类装饰器来扩展原函数, 直接通过类方法修饰后,进行返回class KuoZhan():    def good():        print("新增的方法啦!")    def newfunc(cls):        def in_newfunc():             cls.addpty = "新增的属性"            cls.good = KuoZhan.good            # 此处返回的是一个类            return cls        return in_newfunc# 类.方法 的方式      @KuoZhan.newfunc        #1. MyClass = KuoZhan.newfunc(MyClass) ==> MyClass = in_newfunc class MyClass():    def func():        print("我是原类的方法")obj = MyClass()obj.func()obj.good()print(obj.addpty)>>>我是原类的方法>>>新增的方法啦!>>>新增的属性

4.3 用类装饰器来扩展原类( 改变属性和方法 )

# 用类装饰器来扩展原函数,  通过对象函数化触发__call__方法,进行返回class KuoZhan():    def __call__(self,cls):        return self.newfunc(cls)    def func(self):        print("新增的方法!")    def newfunc(self,cls):        def in_newfunc():             cls.addpty = "新增的属性"            cls.func = KuoZhan.func            # 此处将原方法变成属性            cls.func2 = cls.func2(self)            # 此处返回的是一个实例化对象,使用的是绑定对象方法,所以上句代码使用绑定对象方法            return cls()        return in_newfunc@KuoZhan()        #1.  KuoZhan() ==> obj    2. @KuoZhan()==> @obj  ==>  obj( )   3.  @KuoZhan() == obj( MyClass), ,触发__call__ ,得到 in_newfuncclass MyClass():    addpty = "原有的属性"    def func(self):        print("我是原类的方法")    def func2(self):        return "我是原类的方法2"# MyClass实际就是in_newfunc, MyClass() == in_newfunc() , 所以 obj = cls()obj = MyClass() obj.func()print(obj.addpty)print(obj.func2)>>>新增的方法!>>>新增的属性>>>我是原类的方法2

4.4 用类装饰器来扩展原类( 改变属性和方法 )

# 用类装饰器来扩展原函数,  通过直接调用类方法,进行返回class KuoZhan():    def func():        print("新增的方法!")    def newfunc(cls):        def in_newfunc():             cls.addpty = "新增的属性"            cls.func = KuoZhan.func            # 注意直接使用类方法,不用额外参数            cls.func2 = cls.func2()            # 此处返回的是一个类            return cls        return in_newfunc# 类.方法的方式       @KuoZhan.newfunc        #1. MyClass = KuoZhan.newfunc(MyClass) ==> MyClass = in_newfuncclass MyClass():    addpty = "原有的属性"    def func():        print("我是原类的方法")    def func2():        return "我是原类的方法2"# MyClass实际就是in_newfunc, MyClass() == in_newfunc() , 所以 obj = cls()obj = MyClass()obj.func()print(obj.addpty)print(obj.func2)>>>新增的方法!>>>新增的属性>>>我是原类的方法2

更多相关文章

  1. 为什么不推荐使用finalize方法,来看看对垃圾回收有什么影响吧
  2. java8中的一个骚操作-方法引用(使代码看起来很高大上)
  3. JS内存泄漏排查方法
  4. Java中的泛型方法
  5. 从模版方法模式到 SPI 演变 :好的思想通用而持久
  6. 探寻泛型方法ClassCastException元凶
  7. 如何使用java语言求一个正整数的平方根?(自定义Sqrt方法)

随机推荐

  1. android上传图片或文件
  2. # Android(安卓)不同的第三方库有相同的
  3. Android布局的一些属性和开关、创建log图
  4. Unity与Android交互
  5. Android 软键盘 禁用回车功能或者换成搜
  6. android-1.5,1.6,2.0,2.1,2.2源码下载地
  7. Android kernel code merged into mainli
  8. Android TextView加上阴影效果
  9. Android 启动过程
  10. android 多窗口模式activity的生命周期