#######################################################
#@函数装饰器
# @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)