python @函數裝飾器及 @classmethod, @staticmethod,@property 類中函數裝飾器

#######################################################
#@函數裝飾器
#   @a@b@c f() 
#       將f作爲函數引用 傳給c作爲其第一個參數,
#       將c的運算結果 傳給b作爲其第一個參數
#       將b的運算結果 傳給a作爲其第一個參數
#       ... 以此類推
#       將最頂層(a)的運算結果 作爲最低層(f)的代名詞使用
#           即上面的整個流程只在(f)構造時走一次,以後遇到f時,直接使用運算結果
#
#       注意:
#           在上面整個構造流程中, 使用的全局變量必須顯示聲明
#           如果需要中間求解,即 @a@b(x)@c f(), 那麼先將中間求解後,使用其返回值,再走流程
print('before')
g_a =0
def f(s):
    print('f.', s, g_a)
    return f
def f1(s):
    print('f1.', s, g_a)
    return f1
def f3(s):
    print('f3.', s, g_a)   
    return f3

def fa(fn):
    global g_a; g_a +=1
    print("fa", g_a)
    print(type(fn), fn.__name__)
    return fa

def fb(fn, x):
    global g_a; g_a +=1
    print("fb", g_a)
    print(type(fn), fn.__name__)
    return fa

@fa
@fb(f3, 'a')
def fc():
    global g_a; g_a +=1
    print("fc", g_a)
    return fc

a = f
print(type(a), a.__name__,hex(id(a)))
a = fc
print(type(a),  a.__name__, hex(id(a)))
a = fc
print(type(a),  a.__name__, hex(id(a)))

#######################################################
#類中函數裝飾器
#                        無裝飾:以類實例使用, 且能使用任何屬性
#   @classmethod,        類方法:以類名使用,   只能使用類屬性/構造屬性
#   @staticmethod,       靜態方法:以類名使用, 不可使用類任何屬性
#   @property            屬性化方法:類似於無裝飾,只不過只有一個參數(self),而使用時類似於屬性使用(不用加括號)
class CA:
    va ='va'                #類屬性/構造屬性/顯式聲明屬性
    def __init__(self):
        self.iv ='iv'        #實例屬性/動態屬性/隱式聲明屬性, 動態性,只在調用此函數後聲明地有效
        self.va ='va_i'
    def f(self):
        self.fv ='fv'
        print(self.va)
        print(self.iv)
    @classmethod
    def fa(cls):
        cls.fav ='fav'
        print(cls.va)
        #print(self.iv)     不可使用隱式聲明屬性
    @staticmethod
    def fb():
        print('fb')
    @property
    def fc(self):
        self.fcv ='fcv'
        print('fc', self.va)
        print(self.iv)

a = CA()
a.va +='_a'
a.f()
CA.fa()
CA.fb()
a.fc
print(a.va)
print(a.iv)
print(a.fv)
print(a.fav)
print(a.fcv)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章