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)

 

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