裝飾器就是爲了拓展原來函數或者類功能的一種方法,拓展和被拓展對象能夠是函數,也能夠是類函數
# -*- coding:utf8 -*- def deco(obj): #定義類裝飾器 ''' 這是一個類的裝飾器 ''' obj.x = 1 return obj @deco #語法糖【至關於 deco = deco(foo)】 class Foo: ''' 這是一個測試的類 ''' print(Foo.__dict__) #測試結果,類Foo字典中是否有裝飾器中的屬性
{'__module__': '__main__', '__doc__': '\n 這是一個測試的類\n ', '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, 'x': 1}
# -*- coding:utf8 -*- def Typed(**kwargs): #定義修飾的類 def deco(obj): #定義源類 for key,val in kwargs.items(): #items方法for循環字典中鍵值對 setattr(obj,key,val) #用setattr方法添加鍵值對到obj字典中 return obj #返回源類的obj屬性 return deco #返回修飾過的類 @Typed(A = '小貓',B = '河邊',C = '釣魚') #裝飾器修飾類,加入修飾參數 class Test: #定義的測試類 print("內容是:森林裏有個動物.") #測試類中的內容 print("它是%s,正在%s%s" %(Test.A,Test.B,Test.C))
內容是:森林裏有個動物. 它是小貓,正在河邊釣魚
系統定義的默認裝飾器測試
靜態屬性,和實例綁定.net
非靜態屬性示例code
# -*- coding:utf8 -*- class Text: def __init__(self,name,action): self.Name = name self.Action = action def event(self): print("%s在河邊%s" % (self.Name, self.Action)) P = Text("小貓","釣魚") P.event()
小貓在河邊釣魚
靜態屬性示例(封裝邏輯)對象
# -*- coding:utf8 -*- class Text: def __init__(self,name,action): self.Name = name self.Action = action @property #至關於 【property = property(event)】 def event(self): print("%s在河邊%s" % (self.Name, self.Action)) P = Text("小貓","釣魚") P.event
小貓在河邊釣魚
類方法,和類綁定get
實例化執行示例it
# -*- coding:utf8 -*- class Text: def __init__(self,name,action): self.Name = name self.Action = action def event(self): print("%s在河邊%s" % (self.Name,self.Action)) P = Text("小貓","釣魚") P.event()
小貓在河邊釣魚
類方法非實例化示例io
#-*- coding:utf8 -*- class Text: @classmethod def event(cls,name,action): print("%s在河邊%s" % (name,action)) Text.event("小貓","釣魚")
小貓在河邊釣魚
靜態方法,不和實例綁定,不和類綁定for循環
實例化執行示例event
# -*- coding:utf8 -*- class Text: def __init__(self,name,action): self.Name = name self.Action = action def event(self): print("%s在河邊%s" % (self.Name,self.Action)) P = Text("小貓","釣魚") P.event()
小貓在河邊釣魚
靜態方法示例
# -*- coding:utf8 -*- class Text: @staticmethod def event2(name,action): print("%s在河邊%s" % (name,action)) Text.event2("小貓","釣魚")
小貓在河邊釣魚
# -*- coding:utf8 -*- class Text: def __init__(self,name,action): self.Name = name self.Action = action @property #至關於 【property = property(event)】 def event(self): #觸發get執行 print("%s在河邊%s" % (self.Name,self.Action)) @event.setter #觸發set執行 def event(self,val): print("在%s%s的是一隻%s" %(val,self.Action,self.Name)) P = Text("小貓","釣魚") P.event P.event = '海邊'
小貓在河邊釣魚 在海邊釣魚的是一隻小貓
利用描述符達到自制@property的目的
# -*- coding:utf8 -*- class lazyproperty: #定義模仿property的類 def __init__(self,func): #初始化類 self.func = func def __get__(self, instance, owner): #定義描述符用於生成相似property方法 res = self.func(instance) return res class Text: #原始類 def __init__(self,name,action): self.Name = name self.Action = action @lazyproperty #至關於 【lazyproperty = lazyproperty(event)】 def event(self): print("%s在河邊%s" % (self.Name, self.Action)) P = Text("小貓","釣魚") P.event
小貓在河邊釣魚