1. 普通方法
1.1. 装饰器无参数
def warp(callback):
def f(*args, **kwargs):
print('调用之前')
callback(*args, **kwargs)
print('调用之后')
return f
@warp
def hello(name: str = '未设置'):
print(f'hello {name}')
if __name__ == '__main__':
hello('yimt')
Output
调用之前
hello yimt
调用之后
1.2. 装饰器有参数
def warp(name: str):
def f1(callback):
def f2(*args, **kwargs):
kwargs['name'] = name
print('调用之前')
callback(*args, **kwargs)
print('调用之后')
return f2
return f1
@warp('yimt')
def hello(name: str = '未设置'):
print(f'hello {name}')
if __name__ == '__main__':
hello()
Output
调用之前
hello yimt
调用之后
2. 类方法
2.1. 装饰器不带参数
def wrap(callback):
def f(*args, **kwargs):
print('调用之前')
r = callback(*args, **kwargs)
print('调用之后')
return r
return f
class A:
@wrap
def hello(self, name: str = '未设置'):
print(f'hello {name}')
a = A()
a.hello('yimt')
Output
调用之前
hello yimt
调用之后
2.2. 装饰器带参数
def wrap(name: str):
def f1(callback):
def f2(*args, **kwargs):
kwargs['name'] = name
print('调用之前')
r = callback(*args, **kwargs)
print('调用之后')
return r
return f2
return f1
class A:
@wrap('yimt')
def hello(self, name: str = '未设置'):
print(f'hello {name}')
a = A()
a.hello()
Output
调用之前
hello yimt
调用之后
3. 多装饰器
def warp_a(callback):
def f(*args, **kwargs):
print('a调用之前')
callback(*args, **kwargs)
print('a调用之后')
return f
def warp_b(callback):
def f(*args, **kwargs):
print('b调用之前')
callback(*args, **kwargs)
print('b调用之后')
return f
@warp_a
@warp_b
def hello(name: str = '未设置'):
print(f'hello {name}')
if __name__ == '__main__':
hello('yimt')
Output
a调用之前
b调用之前
hello yimt
b调用之后
a调用之后