Python基礎-面向對象-裝飾器

簡介

裝飾器就是爲了拓展原來函數或者類功能的一種方法,拓展和被拓展對象能夠是函數,也能夠是類函數

示例

# -*- 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))
內容是:森林裏有個動物.
它是小貓,正在河邊釣魚

系統修飾符

系統定義的默認裝飾器測試

property

靜態屬性,和實例綁定.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
小貓在河邊釣魚

classmethod

類方法,和類綁定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("小貓","釣魚")
小貓在河邊釣魚

staticmethod

靜態方法,不和實例綁定,不和類綁定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("小貓","釣魚")
小貓在河邊釣魚

擴展

property配合setter方法

# -*- 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

利用描述符達到自制@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
小貓在河邊釣魚
相關文章
相關標籤/搜索