装饰器必须是可以调用的
# 不带参数的装饰器
def timer(func):
def int_timer(*args, **kwargs):
return func(*args, **kwargs)
return int_timer
@timer
def test01(a, b):
print(a, b)
test01(1, 2)
timer(test01)(1, 2)
# 带参数的装饰器
def timer(x, y):
print(x, y)
def wrap(func):
def int_timer(*args, **kwargs):
return func(*args, **kwargs)
return int_timer
return wrap
@timer(1, 2)
def test01(a, b):
print(a, b)
test01(3, 4)
timer(1, 2)(test01)(3, 4)
# 使用类作为装饰器,需要带括号,不带参数
class timer:
def __call__(self, func):
def int_timer(*args, **kwargs):
return func(*args, **kwargs)
return int_timer
@timer()
def test01(a, b):
print(a, b)
test01(1, 2)
timer()(test01)(1, 2)
# 使用类作为装饰器,不需要带括号,不带参数
class timer:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
@timer
def test01(a, b):
print(a, b)
test01(1, 2)
timer(test01)(1, 2)
# 使用类作为装饰器,带参数
class timer:
def __init__(self, x, y):
self.x = x
self.y = y
def __call__(self, func):
print(self.x, self.y)
def int_timer(*args, **kwargs):
return func(*args, **kwargs)
return int_timer
@timer(3, 4)
def test01(a, b):
print(a, b)
test01(1, 2)
timer(3, 4)(test01)(1, 2)