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

@浙大疏锦行

相关推荐
XR1234567888 分钟前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟43 分钟前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
迷迭香yy1 小时前
集合竞价数据挖掘实战:用Python构建开盘信号识别系统
人工智能·python·数据挖掘
現実君1 小时前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1232 小时前
SpringDAO的用法
java·开发语言·数据库
李昊哲小课4 小时前
fastapi sse websocket 奶茶店实时订单看板
人工智能·python·websocket·网络协议·fastapi·sse
格林威4 小时前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
初级代码游戏5 小时前
iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary
开发语言·ios·swift
2401_844582956 小时前
工具包:软件架构设计的实用技巧与经验分享
python
RFID固定资产管理系统6 小时前
适配媒体行业的固定资产管理软件有哪些功能与核心优势
大数据·人工智能·python·媒体