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

Day 29 训练

Day 29 训练

  • Day 29:Python 类装饰器的奥秘与实践
    • 一、类装饰器:函数装饰器的升级版
    • 二、类装饰器 VS 函数装饰器:核心区别
    • 三、实战:为类添加日志功能
    • 四、类方法定义的两种风格
      • 1. 类内部定义方法(常规方式)
      • 2. 外部赋值定义方法(动态方式)
    • 五、动态修改已定义的类


Day 29:Python 类装饰器的奥秘与实践

在编程的世界里,装饰器是一种强大的工具,它允许我们在不修改原函数或类代码的情况下,增强其功能。今天,我们深入探索类装饰器的魔力,解锁更高级的封装技巧。

一、类装饰器:函数装饰器的升级版

函数装饰器我们已经比较熟悉了,它接收一个函数,返回一个修改后的函数,用于在调用前后添加额外功能(如日志记录、权限验证等)。而类装饰器则更进一步:它接收一个类,返回一个修改后的类。这个强大的特性使我们能够在不触碰原始类代码的前提下,为类添加新的方法、修改现有方法甚至替换整个类。

二、类装饰器 VS 函数装饰器:核心区别

特性函数装饰器类装饰器
作用对象函数(Function)类(Class)
传入参数接收函数作为参数(def decorator(func):)接收类作为参数(def decorator(cls):)
返回值返回包装后的函数(通常是闭包)返回修改后的类(可以是原类或新类)
常见用途修改函数行为(如日志、计时、权限验证)修改类的结构(如添加属性、方法、修改初始化逻辑)
核心逻辑用闭包包裹函数,在不修改函数代码的前提下扩展功能直接修改类的定义(如添加/替换方法、属性)

三、实战:为类添加日志功能

让我们通过一个简单的例子来理解类装饰器的实际应用。我们定义一个类装饰器 class_logger,用于为类添加日志功能。

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] 这是装饰器添加的日志方法

在这个例子中,class_logger 装饰器为 SimplePrinter 类添加了两个功能:

  1. 在实例化对象时记录日志。
  2. 为类添加了一个新的 log 方法,用于记录自定义消息。

四、类方法定义的两种风格

在 Python 中,定义类的方法有两种主要方式:

1. 类内部定义方法(常规方式)

class MyClass:def method(self):print("这是类内部定义的方法")

这种方式简单直观,是定义类方法的常规方式。方法可以直接访问类的其他成员,包括私有成员。

2. 外部赋值定义方法(动态方式)

def external_method(self):print("这是外部定义的方法")class MyClass:passMyClass.external_method = external_method  # 动态添加方法

这种方式允许我们在类定义完成后再动态添加方法,常用于装饰器、元类和动态编程场景。需要注意的是,外部定义的方法需要通过 self 或类名显式访问类的其他成员。

五、动态修改已定义的类

装饰器的本质是语法糖。对于类装饰器而言,@decorator 语法实际上是 MyClass = decorator(MyClass) 的简写。这意味着即使类已经定义完成,我们仍然可以通过手动调用装饰器函数来修改它。

class ExistingClass:def __init__(self, value):self.value = value# 手动应用装饰器修改已定义的类
ExistingClass = class_logger(ExistingClass)obj = ExistingClass("Test")  # 触发装饰器添加的日志功能

浙大疏锦行

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

相关文章:

  • 永磁同步电机控制算法-滑模反馈线性化控制器
  • 红队攻防实践:15大漏洞原理与复现全解析
  • 【agent】简历信息提取智能体
  • AGV(自动导引车)通信协议及通信链路性能需求分析
  • 力扣HOT100之图论:994. 腐烂的橘子
  • 二、详细解释OpenGL图形管线中顶点处理阶段的工作原理
  • day57—快速(选择/排序)—数组中的第 K 个最大元素(LeetCode-215)
  • 国家网络身份认证公共服务管理办法
  • nginx配置跨域请求,后台不用配置啦,完美
  • vue 水印组件
  • 【Dv3Admin】插件 dv3admin_chatgpt 优化支持多种启动方式实现SSE效果
  • QT之巧用对象充当信号接收者
  • Linux进程 线程 进程间通信 IPC——管道
  • 全国青少年信息素养大赛-python编程—省赛真题—卡牌游戏
  • Redis配置文件详解
  • 树 Part 10
  • JFace中MVC的表的单元格编辑功能的实现
  • Datawhale_PyPOTS_task6
  • 【安全攻防与漏洞​】​​HTTPS中的常见攻击与防御​​
  • 机器人强化学习入门学习笔记(三)
  • 洛谷 P1800 software(DP+二分)【提高+/省选−】
  • 三步快速部署一个本地Windows/Linux大语言模型ChatGLM(环境配置+权重下载+运行)
  • AI架构分层原则
  • Stack主题遇到的问题
  • C# WinForm应用程序多语言实现全面指南
  • deepseek组合使用
  • 测试关键点
  • 【Kafka】编写消费者开发模式时遇到‘未解析的引用‘SIGUSR1’’
  • 掌握递归:编程中的优雅艺术
  • 精益数据分析(79/126):从黏性到爆发——病毒性增长的三种形态与核心指标解析