#######################################################
#@函數裝飾器
# @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)