由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类
上一篇:由浅入深,走进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
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。