Python 装饰器进阶使用技巧
接着上一篇的内容,继续讲一些进阶技巧
上篇内容:学会Python装饰器,开发快人一步
带参数的装饰器
装饰器本身也可以接受参数,这使得装饰器更加灵活。
def my_decorator(arg1):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"Decorator {arg1} applied before function {func.__name__}.")
return func(*args, **kwargs)
return wrapper
return decorator
@my_decorator("Special Argument")
def my_function():
pass
类装饰器
类也可以作为装饰器使用,这允许你在装饰器中使用更多的面向对象的特性。
class DecoratorClass:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("Something happening before the function.")
result = self.func(*args, **kwargs)
print("Something happening after the function.")
return result
@DecoratorClass
def my_function():
print("Function is executed.")
装饰器工厂
装饰器工厂是一个函数,它返回一个装饰器。
def decorator_with_args(arg):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"Argument: {arg}")
return func(*args, **kwargs)
return wrapper
return decorator
@decorator_with_args('Hello')
def my_function():
pass
嵌套装饰器
装饰器可以嵌套使用,这允许你在一个函数上应用多个装饰器。
@decorator_one
@decorator_two
def my_function():
pass
使用functools.wraps
为了保持被装饰函数的元数据,可以使用functools.wraps
。
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 装饰器逻辑
return func(*args, **kwargs)
return wrapper
带状态的装饰器
装饰器可以维护状态,这对于缓存结果等场景非常有用。
def memoize(func):
cache = {}
@wraps(func)
def wrapper(*args, **kwargs):
key = str(args) + str(kwargs)
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
return wrapper
装饰器应用到类和方法
装饰器不仅可以应用于函数,还可以应用于类和类方法。
class MyClass:
@classmethod
@my_decorator
def class_method(cls):
pass
@my_decorator
def instance_method(self):
pass
以上是 Python 装饰器的一些进阶使用技巧,利用这些技巧可以编写出更加灵活和强大的代码。