一、函数装饰器
"""
python装饰器@改变函数引用
"""
def b(func):
x= 1
def c(a1,a2=0):
print("******in ","c")
print("******in ","c"," a1=",a1)
func(a1,a2)
print(" b complete!")
return c
@b # 这句话等价于a = b(a),即把a由指向原来的函数改为指向了调用b()函数的返回值(划重点)
def a(a1,a2=0):
print("----------run ", "a")
print("----------a1: ", a1)
print("----------a2: ", a2)
#a() #报错
#a = b(a) #报错
a(100,400)
#a() #报错
执行结果:
b complete!
******in c
******in c a1= 100
----------run a
----------a1: 100
----------a2: 400
二、类装饰器
"""记录函数调用次数”“”
#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""装饰请配合__call__函数统计某函数调用次数"""
class Sat():
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count +=1
return self.func(*args, **kwargs)
@Sat
def test(nu):
print("test method is running--%s" % nu)
if __name__ == "__main__":
test(1)
test("aaa")
print("----->count=",test.count)
test(9)
print("----->count=",test.count)
三、带参数的通用装饰器
In [244]: def aa(k,y):
...: l = list((k,y))
...: print(l)
...: def set_func(func):
...: print("in set_func")
...: def call_func(*args,**kwargs):
...: print("in call_func")
...: return func(*args,**kwargs)
...: return call_func
...: return set_func
...:
In [245]: @aa(11,99) # 先调用aa函数拿到返回值后再装
...: def dd(x):
...: print("in dd x=",x)
...:
输出:
[11, 99]
in set_func
调用dd函数
In [246]: dd(5)
in call_func
in dd x= 5