python打卡day29

类的装饰器
知识点回顾

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

回顾一下,函数的装饰器是 :接收一个函数,返回一个修改后的函数。类也有修饰器,类装饰器本质上确实是一个函数,他的逻辑类似,接收一个类,返回一个修改后的类或者新类。通过类装饰器,可以在不修改类内部代码的情况下,为多个类统一添加功能(如日志、统计),类装饰器有两种常见实现方式:

  • 直接修改类(添加新的方法或属性,修改原有方法比如构造方法)
  • 使用 wrapper() 返回新类(更接近函数装饰器模式)
python 复制代码
# 方式1:直接修改类
def decorator1(cls):
    cls.new_attr = 'value'  # 直接添加属性
    return cls  # 返回原类

# 方式2:使用wrapper(类似函数装饰器)
def decorator2(cls):
    class Wrapper(cls):  # 创建子类
        new_attr = 'value'
    return Wrapper

举个具体例子来看看,这是直接修改类

python 复制代码
# 定义类装饰器:为类添加日志功能
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("这是装饰器添加的日志方法")  # 调用装饰器新增的方法


# 输出:[LOG] 实例化对象: SimplePrinter
# 输出:Alice: Hello, World!
# 输出:[LOG] 这是装饰器添加的日志方法

第二种用 wrapper() 封装返回的方法就不谈了,之前函数装饰器接触过

收获心得:

学了这么多天,感觉python就是万物皆可类,类又有属性和方法,跟原先的C语言学习比起来,从数据结构、从函数或者类的复用、封装、动态修改等方面更进一步有了不同

@浙大疏锦行

相关推荐
zbhbbedp282793cl12 分钟前
如何在VSCode中安装Python扩展?
ide·vscode·python
ᐇ9591 小时前
Java LinkedList集合全面解析:双向链表的艺术与实战
java·开发语言·链表
码银1 小时前
【数据结构】顺序表
java·开发语言·数据结构
Python私教2 小时前
Python 开发环境安装与配置全指南(2025版)
开发语言·python
百锦再2 小时前
第12章 测试编写
android·java·开发语言·python·rust·go·erlang
无敌最俊朗@2 小时前
C++ 并发与同步速查笔记(整理版)
开发语言·c++·算法
熠熠仔2 小时前
QGIS 3.34+ 网络分析基础数据自动化生成:从脚本到应用
python·数据分析
测试19983 小时前
Appium使用指南与自动化测试案例详解
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
Elastic 中国社区官方博客3 小时前
Observability:适用于 PHP 的 OpenTelemetry:EDOT PHP 加入 OpenTelemetry 项目
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·php
csbysj20203 小时前
PHP 魔术常量
开发语言