装饰器是一种特殊类型的Python函数,它可以用来修改或增强其他函数或类的行为。装饰器本质上是一个接受函数或类作为参数的高阶函数,它返回一个新的函数或类,通常用于在不修改原始代码的情况下添加功能。
装饰器通常用于以下几种情况:
类装饰器通常用于修改类的行为。下面是一个简单的类装饰器示例,它会在类创建时打印一条消息:
def class_decorator(cls):
class NewClass(cls):
def __init__(self, *args, **kwargs):
print("Creating an instance of the decorated class.")
super().__init__(*args, **kwargs)
return NewClass
@class_decorator
class MyClass:
def __init__(self, value):
self.value = value
# 使用装饰后的类
obj = MyClass(10) # 输出: Creating an instance of the decorated class.
__name__
, __doc__
)。原因:装饰器返回的新类覆盖了原始类的元数据。
解决方法:使用 functools.wraps
或 functools.update_wrapper
来保留原始类的元数据。
import functools
def class_decorator(cls):
@functools.wraps(cls)
class NewClass(cls):
def __init__(self, *args, **kwargs):
print("Creating an instance of the decorated class.")
super().__init__(*args, **kwargs)
return NewClass
@class_decorator
class MyClass:
"""Original class documentation."""
def __init__(self, value):
self.value = value
print(MyClass.__name__) # 输出: MyClass
print(MyClass.__doc__) # 输出: Original class documentation.
下面是一个更复杂的类装饰器示例,它在类创建时添加了一个新的方法:
def add_method_decorator(cls):
def new_method(self):
return "New method added by decorator."
cls.new_method = new_method
return cls
@add_method_decorator
class MyClass:
def __init__(self, value):
self.value = value
# 使用装饰后的类
obj = MyClass(10)
print(obj.new_method()) # 输出: New method added by decorator.
通过这种方式,可以在不修改原始类的情况下,动态地为类添加新的功能。
领取专属 10元无门槛券
手把手带您无忧上云