一、单例模式装饰器
目标:确保一个类只能创建一个实例。
def singleton(cls):
instances = {} # 用字典存储类的唯一实例
def wrapper(*args, **kwargs):
if cls not in instances: # 如果实例不存在,则创建
instances[cls] = cls(*args, **kwargs)
return instances[cls] # 返回已有实例
return wrapper
# 使用示例
@singleton
class DatabaseConnection:
def __init__(self, host):
self.host = host
# 测试
conn1 = DatabaseConnection("localhost:3306")
conn2 = DatabaseConnection("another_host") # 不会生效,仍返回 conn1 的实例
print(conn1 is conn2) # 输出 True
二、方法调用日志装饰器
目标:自动记录类的初始化和方法调用。
def log_class(cls):
# 包装 __init__ 方法
original_init = cls.__init__
def __init__(self, *args, **kwargs):
print(f"[LOG] 初始化 {cls.__name__},参数: args={args}, kwargs={kwargs}")
original_init(self, *args, **kwargs)
cls.__init__ = __init__
# 包装所有其他方法
for name, method in cls.__dict__.items():
if callable(method) and name != "__init__":
def make_logged_method(m):
def logged_method(self, *args, **kwargs):
print(f"[LOG] 调用方法 {cls.__name__}.{m.__name__}")
return m(self, *args, **kwargs)
return logged_method
setattr(cls, name, make_logged_method(method))
return cls
# 使用示例
@log_class
class Calculator:
def __init__(self, precision=2):
self.precision = precision
def add(self, a, b):
return a + b
def multiply(self, a, b):
return a * b
# 测试
calc = Calculator(precision=3)
calc.add(2, 3)
calc.multiply(4, 5)
三、进阶:带参数的类装饰器
如果需要动态配置装饰器行为(如是否启用日志),可以添加参数:
def conditional_log(enable=True):
def decorator(cls):
original_init = cls.__init__
def __init__(self, *args, **kwargs):
if enable:
print(f"[LOG] 初始化 {cls.__name__}")
original_init(self, *args, **kwargs)
cls.__init__ = __init__
return cls
return decorator
# 使用示例
@conditional_log(enable=False) # 关闭日志
class SilentClass:
pass