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

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

http://www.xdnf.cn/news/7095.html

相关文章:

  • Python——一些琐碎知识点
  • Java八股文——Java基础篇
  • 刷题心得:荷兰国旗问题与三指针法题目背景
  • AM32电调学习解读七:其他代码文件介绍
  • 2901. 最长相邻不相等子序列 II
  • Seata源码—6.Seata AT模式的数据源代理一
  • 2025.05.17得物机考笔试真题第二题
  • React 19中useContext不需要Provider了。
  • Java基础知识总结(超详细整理)
  • 32LED心形灯程序源代码
  • 常见的 HTTP 接口(请求方法)
  • PCB设计(十九)PCB设计中NPN/PNP选型策略
  • Window远程连接Linux桌面版
  • 掘金欧洲宠物经济新蓝海:比利时天然宠粮市场爆发与跨境新机遇
  • c++从入门到精通(六)--特殊工具与技术-完结篇
  • Azure 机器学习初学者指南
  • Nacos数据写入流程
  • 深入理解EKS 工作节点的网络架构
  • Cadence学习笔记之---PCB器件放置与布局
  • SSM框架整合:从入门到实战
  • 大模型微调步骤整理
  • Flink CEP是什么?
  • 【数据结构与算法】ArrayList 与顺序表的实现
  • C++23 新特性:使某些视图的多参数构造函数显式化(P2711R1)
  • HBM的“暗战”
  • Spring AOP从0到1
  • STM32CubeMX生成UTF-8编码文件的设置方法
  • 第12章 Java多线程机制
  • 阶段四 项目1-苍穹外卖 第一章 Git
  • 基于matlab/simulink锂电池算法学习集合(SOC、SOH、BMS)