上一篇:由淺入深,走進Python裝飾器-----第四篇:進階--函數裝飾類ide
類裝飾器 函數
@類 類
# 用類裝飾器來擴展原函數, 經過對象函數化觸發__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) >>>我是原類的方法 >>>新增的方法啦! >>>新增的屬性
# 用帶參數類裝飾器擴展原函數, 經過對象函數化觸發__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_newfunc class MyClass(): def func(self): print("我是原類的方法") # MyClass實際就是in_newfunc, MyClass() == in_newfunc() , 因此 obj = cls() # 對象調用方式 obj = MyClass() obj.func() obj.good() print(obj.addpty) >>>我是原類的方法 >>>新增的方法啦! >>>新增的屬性
# 用類裝飾器來擴展原函數, 直接經過類方法修飾後,進行返回 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) >>>我是原類的方法 >>>新增的方法啦! >>>新增的屬性
# 用類裝飾器來擴展原函數, 經過對象函數化觸發__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
# 用類裝飾器來擴展原函數, 經過直接調用類方法,進行返回 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_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