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] 实例化对象: SimplePrinter

printer.log("草莓蛋糕已发货")      
# 输出 → [LOG] 草莓蛋糕已发货

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值