由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类
2019-05-02 17:18
841 查看
**类装饰器** @类 类
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_newfunc class 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_newfunc class 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 = "新增的属性" 272a cls.func = KuoZhan.func # 注意直接使用类方法,不用额外参数 cls.func2 = cls.func2() # 此处返回的是一个类 return cls return in_newfunc # 类.方法的方式 @KuoZhan.newfunc #1. MyClass = KuoZhan.newfunc(MyClass) ==> MyClass = in_newfunc class 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
相关文章推荐
- 由浅入深,走进Python装饰器-----第二篇:进阶--类装饰函数
- 由浅入深,走进Python装饰器-----第二篇:进阶1
- 洗礼灵魂,修炼python(30)--装饰器(2)—>装饰器总结+进阶使用
- Python装饰器-专题笔记-学会装饰器,Python更进阶
- 由浅入深理解Python装饰器
- 由浅入深了解python里面的函数,闭包,装饰器
- python装饰器2:进阶
- 详解Python装饰器由浅入深
- python装饰器:有参数的装饰器、不定长参数的装饰器、装饰有返回值的函数、通用的装饰器
- Python 进阶_闭包 & 装饰器
- Python 进阶----*args和 **kwargs,装饰器 的用法
- Python之迭代器,生成器与装饰器进阶
- python进阶:闭包、map/reduce/filter函数、lambda函数、装饰器
- Python进阶之装饰器
- python装饰器:有参数的装饰器、不定长参数的装饰器、装饰有返回值的函数、通用的装饰器
- python装饰器之类内部成员装饰
- 1Python进阶强化训练之装饰器使用技巧进阶
- python装饰器的4中类型:函数装饰函数、函数装饰类、类装饰函数、类装饰类
- python 由浅入深理解装饰器
- (转)python装饰器进阶一