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

DAY 29 复习日:类的装饰器

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

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

一、对函数的理解进化:
1. 函数是第一公民:深刻理解了函数作为参数传递、返回值使用的灵活性
2. 装饰器魔法:通过类装饰器实践(如示例中的class_logger),掌握了函数闭包和作用域的精妙
3. 参数处理:*args/**kwargs的动态参数机制在实际开发中的强大威力二、类的认知突破:
1. 实例化过程:通过重写__init__方法(如示例中的new_init),理解了对象创建的完整生命周期
2. 方法绑定:实践了动态添加类方法(如log_message),体会到Python的动态特性
3. 封装艺术:通过SimplePrinter案例,掌握了通过类组织相关行为的封装技巧

输入

# 定义类装饰器:为类添加日志功能
def class_logger(cls):# 保存原始的 __init__ 方法
    original_init = cls.__init__def new_init(self, *args, **kwargs):# 新增实例化日志print(f"[LOG] 实例化对象: {cls.__name__}")
        original_init(self, *args, **kwargs)  # 调用原始构造方法# 将类的 __init__ 方法替换为新方法
    cls.__init__ = new_init# 为类添加一个日志方法(示例)def log_message(self, message):print(f"[LOG] {message}")    cls.log = log_message  # 将方法绑定到类,这是一种将外部函数添加为类的属性的方法return cls# 定义简单打印类,应用装饰器
# 同样是语法糖的写法
@class_logger
class SimplePrinter:def __init__(self, name):
        self.name = name  # 构造方法:初始化名称def print_text(self, text):"""简单打印方法"""print(f"{self.name}: {text}")# 使用示例
printer = SimplePrinter("Alice")  # 实例化时触发装饰器的日志
printer.print_text("Hello, World!")  # 调用普通方法
printer.log("这是装饰器添加的日志方法")  # 调用装饰器新增的方法

解释

🍰【类装饰器就像蛋糕店的新服务】🍰

原始蛋糕店(SimplePrinter类):

只有基础功能:做蛋糕(init) 和 包装蛋糕(print_text)

装修公司进场(class_logger装饰器):

# 装修步骤1:给做蛋糕流程加监控
def new_init(...):print("监控:开始制作蛋糕啦!")  # [LOG] 实例化对象
    original_init(...)            # 原来的做蛋糕流程不变# 装修步骤2:新增外卖服务
def log_message(...):print("外卖:您的蛋糕日志")     # 新增的log方法

装修后的蛋糕店(@class_logger装饰后的类):

保留原有功能 ✅

新增功能:自动记录每单制作(实例化时打印LOG)

支持外卖订单跟踪(log方法)

客户体验(使用示例):

printer = SimplePrinter("Alice")  
# 自动打印 → [LOG] 实例化对象: SimplePrinterprinter.log("草莓蛋糕已发货")      
# 输出 → [LOG] 草莓蛋糕已发货

装饰器像"外挂":不修改原类代码就能添加新功能

动态改造:运行时给类换"心脏"(替换__init__方法)

功能扩展:就像给手机装新APP,给类增加新方法

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

相关文章:

  • # 终端执行 java -jar example.jar 时(example.jar为项目jar包)报错:“没有主清单属性” 的解决方法
  • 第一章:重启之始
  • 零基础搭建!基于PP-ShiTuV2的轻量级图像识别系统(Docker+API部署指南)
  • 蓝桥杯1140 最小质因子之和(Hard Version)
  • 2KW压缩机驱动参考设计【SCH篇】
  • 使用conda创建python虚拟环境,并自定义路径
  • C++学习:六个月从基础到就业——C++20:协程(Coroutines)
  • Golang内存逃逸
  • 用代码解读_AI_强化学习在机器人路径规划中的应用与优化
  • nginx相关面试题30道
  • OpenCV-去噪效果和评估指标方法
  • MapReduce-WordCount实现按照value降序排序、字符小写、识别不同标点
  • 【ROS2】 核心概念6——通信接口语法(Interfaces)
  • 定时器相关概念
  • C++(243~263)STL常用算法、遍历算法(for_each,Transform)、查找算法、拷贝和替换、常用算术生成,常用集合算法。
  • 2025抓包工具Reqable手机抓包HTTPS亲测简单好用-快速跑通
  • 小米汽车:新能源赛道的破局者与变革者
  • Python 向量化操作如何实现多条件筛选
  • SpringBoot(一)--- Maven基础
  • 大模型评测体系综述
  • java19
  • 1.2.2
  • Java可变参数与Collections工具类详解
  • [Java实战]Spring Boot整合Elasticsearch(二十六)
  • ARM A64 STR指令
  • LWIP的Socket接口
  • 扫描件交叉合并PDF免费软件 拖拽即合并 + 自动对齐页码 档案整合更轻松
  • C++多态与虚函数详解——从入门到精通
  • 【计算机网络】第一章:计算机网络体系结构
  • 数青蛙 --- 模拟