装饰器
一、装饰器理解第一步:
def outer(func): #return ("111",func) return ("111") @outer def f1(): print("f1") # @函数名 # 1、自动执行outer函数,并且将其下面的函数名f1当作参数传递 # 2、将outer函数的返回值,重新赋值给f1这个对象,所以f1()这个值就没有意义 # print(f1) # 输出111
二、装饰器理解第二步:
def outer(func): def inner(): print("before") return inner @outer def f1(): print("f1") # 相当于f1()被inner()覆盖,输出before
三、装饰器理解第三步:
def outer(func): def inner(): # 覆盖f1(),变成新的f1() print("before") func() #调用老的f1() print("after") return inner @outer def f1(): print("f1") f1() # 相当于f1()被inner()覆盖,输出before, # 然后再把老的f1(),作为参数传进去,输出befor , f1, after
四、装饰器返回值的问题
def outer(func): def inner(): # 覆盖f1(),变成新的f1() print("before") func() #调用老的f1() print("after") return inner @outer def f1(): print("f1") x=f1() print(x) # 相当于f1()被inner()覆盖,输出before, # 然后再把老的f1(),作为参数传进去 # f1函数本身并没有返回值。返回值是None 。 本例输出: before , f1 , after , None
五、关于返回值实际举例:
def outer(func): def inner(): # 覆盖f1(),变成新的f1() print("before") ret = func() #仍旧执行了原函数的 print(f1) print("after") return ret return inner @outer def f1(): print("f1") return "FFFF" test = f1() print(test) # 输出如下: # before # f1 # after # FFFF
六、带参数的返回
def outer(func): def inner(a): # 需要补充参数 print("before") ret = func(a) # 需要补充参数 print("after") return ret return inner @outer def f1(args):# 带参数 print(args) return "FFFF" test = f1("fafafafafa") print(test)
六、装饰器举例:
# 装饰器 def outer(func): def inner(): # print("log") return func() return inner() @outer def f1(): print("f1") @outer def f2(): print("f2") @outer def f3(): print("f3")
浙公网安备 33010602011771号