DAY 29 复习日:类的装饰器
知识点回顾
- 类的装饰器
- 装饰器思想的进一步理解:外部修改、动态
- 类方法的定义:内部定义和外部定义
作业:复习类和函数的知识点,写下自己过去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,给类增加新方法