Python装饰器
介绍
对函数进行扩展,增加额外的功能
-
开放封闭原则:
开放:对拓展功能是开放的
封闭:对修改源代码是封闭的
函数装饰器
点击查看代码
from functools import wraps
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('wrapper...')
...
return func(*args, **kwargs)
return wrapper
@decorate
def demo():
return sum([i**2 for i in range(10)])
print(demo())
携带参数
点击查看代码
from functools import wraps
def test(v='test'):
print('outer: ', v)
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('wrapper...')
print('inner: ', v)
...
return func(*args, **kwargs)
return wrapper
return decorate
@test('demo')
def demo():
return sum([i**2 for i in range(10)])
print(demo())
类装饰器
使用类作为装饰器来装饰函数或其他可调用对象。在类装饰器中,装饰逻辑通常被包装在类的 __init__
和 __call__
方法中。
点击查看代码
class MyDecorator:
def __init__(self, func): # 在装饰器被创建时调用
self.func = func
print('init')
def __call__(self, *args, **kwargs): # 在被装饰的函数被调用时调用。
print('wrapper...')
result = self.func(*args, **kwargs)
return result
@MyDecorator # 调用 __init__
def demo(x, y):
return x + y
res = demo(2, 3) # 调用 __call__
print("Result:", res)
携带参数
点击查看代码
class MyDecorator:
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
print('init')
def __call__(self, func):
def wrapper(*args, **kwargs):
print('wrapper')
result = func(*args, **kwargs)
return result
return wrapper
@MyDecorator("Hello", 123)
def demo(x, y):
return x + y
res = demo(2, 3)
print("Result:", res)
类方法装饰器
将类方法以装饰器进行使用,如:路由注册
点击查看代码
from typing import Callable
class Obj:
def __init__(self, name='Obj'):
self.name = name
self.all_func = []
def __decorator(self, method: str, **options):
def wrapper(func):
print('wrapper')
self.all_func.append(func.__name__)
print(f'{self.name} [{method}]')
def action(*args, **kwargs):
print('action...')
return func(*args, **kwargs)
return action
return wrapper
def get(self, **options) -> Callable:
return self.__decorator('GET', **options)
def post(self, **options) -> Callable:
return self.__decorator('POST', **options)
obj = Obj()
@obj.get()
def test_get(data='get'):
return data
@obj.post()
def test_post(data='post'):
return data
print(obj.all_func)
print(test_get())
print(test_post())
遇上方知有