当前位置: 首页 > news >正文

python打卡第29天

知识点回顾

  1. 类的装饰器
  2. 装饰器思想的进一步理解:外部修改、动态
  3. 类方法的定义:内部定义和外部定义

作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等,未来再过几个专题部分我们即将开启深度学习部分。

一、单例模式装饰器

目标:确保一个类只能创建一个实例。

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
原理说明:
  1. singleton 是一个类装饰器,它通过闭包维护一个字典 instances
  2. 当类第一次被实例化时,会创建实例并存入字典;后续请求直接返回已有实例。
  3. 无论传递多少参数,后续实例化都会忽略参数并返回第一个实例(需注意参数一致性)
  4. 二、方法调用日志装饰器

    目标:自动记录类的初始化和方法调用。

    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_methodsetattr(cls, name, make_logged_method(method))return cls# 使用示例
    @log_class
    class Calculator:def __init__(self, precision=2):self.precision = precisiondef add(self, a, b):return a + bdef 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 clsreturn decorator# 使用示例
    @conditional_log(enable=False)  # 关闭日志
    class SilentClass:pass

相关文章:

  • Spring AOP从0到1
  • profibusDP主站转profinet网关接E+H流量计在污水处理中的应用
  • 基于springboot+vue的车票管理系统
  • Rstudio换皮:自定义彩虹括号与缩进线
  • 黑灰产业链深度解析
  • DeepSeek 赋能脑科学:解锁神经科学研究与应用的新密码
  • 二:操作系统之进程概念
  • 例举3种强制类型转换和2种隐式
  • 【Bluedroid】蓝牙HID DEVICE 报告发送与电源管理源码解析
  • 《Python星球日记》 第92天:AI模型部署工程化基础
  • DSU-Net
  • 第二十八天打卡
  • 基于PageHelper的分页查询
  • Leetcode 3552. Grid Teleportation Traversal
  • 数据库触发器Trigger
  • 算法题(149):矩阵消除游戏
  • 大模型评测体系综述
  • 学习黑客Active Directory 入门指南(四)
  • 苍穹外卖--修改菜品
  • 【超详细】面试中问到事件循环(Event Loop)机制?
  • “十五五”时期长三角需创新机制,形成高水平一体化合作路径
  • 牛市早报|上市公司重大资产重组新规出炉,4月经济数据将公布
  • 常州新型碳材料集群产值近二千亿,请看《浪尖周报》第24期
  • “复旦源”一源六馆焕新启幕,设立文化发展基金首期1亿元
  • 一涉嫌开设赌场的网上在逃人员在山东威海落网
  • 恒生银行回应裁员传闻:受影响的员工数目占银行核心业务员工总数约1%