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

Python训练打卡Day29

复习日:类的装饰器
既然函数可以复用,有了类和装饰器,那么类还能进一步封装么?可以的,类也有装饰器

        回顾一下,函数的装饰器是 :接收一个函数,返回一个修改后的函数。我们之前是用复用的思想来看装饰器的,换一个角度理解,当你想修改一个函数的时候,可以通过装饰器方法来修改而无需重新定义这个函数。类也有修饰器,他的逻辑类似:接收一个类,返回一个修改后的类。例如

1. 添加新的方法或属性(如示例中的 log 方法)。

2. 修改原有方法(如替换 __init__ 方法,添加日志)。

3. 甚至可以返回一个全新的类(继承或组合原类)。

通过类装饰器,可以在不修改类内部代码的情况下,为多个类统一添加功能(如日志、统计)

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

注意到其中的cls.log = log_message 这行代码,他把外部的函数赋值给了类的新定义的属性,这里我们介绍这种写法

实际上,定义类的方法,有2类写法

1. 在类定义内部直接写方法,这是静态方法,一般定义类都这么完成。

2. 在类定义外部定义方法,然后把方法赋值给类的属性---这是一种动态方法,常在装饰器中使用,可以再外部修改类的方法。

两种方式的本质都是将函数对象绑定到类的属性上,只是语法和应用场景不同。装饰器中常用外部赋值,是为了在不修改原类代码的情况下增强类的功能。

总结:装饰器的核心是动态修改类 / 函数,而不改变原代码。通过外部赋值,可以在不修改类定义的前提下,为类添加新方法或修改已有方法。---理解动态的含义

@浙大疏锦行
http://www.xdnf.cn/news/550765.html

相关文章:

  • Latex写作中文版
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月20日第83弹
  • C# 类的基本概念(程序和类:一个简单的示例)
  • web基础
  • 信奥赛-刷题笔记-栈篇-T3-P4387验证栈序列0520
  • Web技术与Nginx网站环境
  • 分布式序列生成方案 : Redis Incr | 基于Redisson创建自增获取序号,每天更换一个key, key到期时间1天,用于创建订单号、快递单号
  • 机器学习 day05
  • [java八股文][Java虚拟机面试篇]垃圾回收
  • ubuntu下实时检测机械硬盘和固态硬盘温度
  • 设计模式----软考中级软件设计师(自用学习笔记)
  • MD编辑器推荐【Obsidian】含下载安装和实用教程
  • AI指令模板综述(Prompt Review)
  • 车道线检测:自动驾驶的“眼睛”
  • 2025系统架构师---案例题(押题)
  • 4.安卓逆向2-抓包工具charles的安装和配置和基本使用
  • 从 0 到 1 选对 AI 自动化平台,深度对比三大AI自动化平台:n8n vs Dify vs Coze(附选型指南与实战案例)
  • 联合索引失效情况分析
  • 【神经网络与深度学习】扩散模型之通俗易懂的解释
  • 分治思想在算法(目标检测)中的体现
  • 第二章 何谓第二大脑?笔记记录
  • 1.6 提示词工程(二)
  • Gas优化利器:Merkle 树如何助力链上数据效率革命
  • 25-CAN总线
  • avalonia android连接模拟器时报错adb cannot run as root in production builds,没有权限
  • 计算机视觉与深度学习 | Matlab实现EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR时间序列预测(完整源码和数据)
  • 结合仿生学原理与计算科学进行原创性构思
  • 威纶通触摸屏IP地址设定步骤及程序下载指南
  • Windows 上配置 Docker,Docker 的基本原理和用途,以及如何在 Docker 中运行程序
  • AI-02a5a7.神经网络-与学习相关的技巧-正则化