Python打卡训练营day29——2025.05.18

发布于:2025-05-20 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、单例模式装饰器
目标:确保一个类只能创建一个实例。

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

@浙大疏锦行


网站公告

今日签到

点亮在社区的每一天
去签到