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语言学习比起来,从数据结构、从函数或者类的复用、封装、动态修改等方面更进一步有了不同

@浙大疏锦行

相关推荐
Boilermaker19921 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
沈浩(种子思维作者)1 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
MM_MS1 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
꧁Q༒ོγ꧂2 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs2 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_992 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
io_T_T2 小时前
迭代器 iteration、iter 与 多线程 concurrent 交叉实践(详细)
python
古城小栈2 小时前
Rust 迭代器产出的引用层数——分水岭
开发语言·rust
华研前沿标杆游学2 小时前
2026年走进洛阳格力工厂参观游学
python
Carl_奕然2 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析