day 29

类装饰器

类有修饰器,他的逻辑:接收一个类,返回一个修改后的类。例如

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

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

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

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

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

注意点:

1.cls.log = log_message 把 log_message 函数赋值给 cls 类的 log 属性。这样,被装饰的类的所有实例都能调用 log 方法。

2.类的装饰器的用法和子类的用法很相似,子类也可以对原来的类进行修改,添加新的属性等,但是这两者有很大区别:

  1. 实现机制不同:

类装饰器 :本质是一个函数,接收一个类作为参数,返回一个新的类或者修改后的原类。它是在类定义完成后对类进行处理,属于运行时操作。

子类 :通过继承机制创建一个新类,新类继承父类的属性和方法,并且可以在此基础上进行扩展或重写。它是在类定义阶段完成的,属于静态操作。

  1. 代码复用和扩展性不同:

类装饰器 :更适合对多个不相关的类添加相同的功能,能提高代码的复用性。但对于复杂的层次化扩展,使用类装饰器会让代码逻辑变得复杂。

子类 :适合构建具有层次结构的类体系,通过继承关系可以清晰地表达类之间的关系,便于代码的维护和扩展。

  1. 灵活性不同:

类装饰器 :可以在不修改原有类定义的情况下,动态地为类添加功能。一个类可以被多个装饰器装饰,实现功能的组合。如:

python 复制代码
@decorator1

@decorator2

class MyClass:

    pass

子类 :子类的功能在定义时就已经确定,若要修改功能,通常需要修改子类的定义。

  1. 可维护性不同:

类装饰器 :当装饰器逻辑复杂时,可能会增加代码的理解难度,尤其是多个装饰器嵌套使用时。

子类 :继承关系清晰,代码的层次结构明确,便于理解和维护。

@浙大疏锦行

相关推荐
编程武士1 小时前
从50ms到30ms:YOLOv10部署中图像预处理的性能优化实践
人工智能·python·yolo·性能优化
我的xiaodoujiao1 小时前
Windows系统Web UI自动化测试学习系列2--环境搭建--Python-PyCharm-Selenium
开发语言·python·测试工具
傻啦嘿哟4 小时前
Python SQLite模块:轻量级数据库的实战指南
数据库·python·sqlite
Q_Q5110082854 小时前
python+django/flask+uniapp基于微信小程序的瑜伽体验课预约系统
spring boot·python·django·flask·uni-app·node.js·php
XueminXu4 小时前
Python读取MongoDB的JSON字典和列表对象转为字符串
python·mongodb·json·pymongo·mongoclient·isinstance·json.dumps
techdashen4 小时前
12分钟讲解Python核心理念
开发语言·python
jie*4 小时前
小杰机器学习(nine)——支持向量机
人工智能·python·机器学习·支持向量机·回归·聚类·sklearn
闭着眼睛学算法4 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od
郝学胜-神的一滴4 小时前
谨慎地迭代函数所收到的参数 (Effective Python 第31条)
开发语言·python·程序人生·软件工程
没有梦想的咸鱼185-1037-16635 小时前
【遥感技术】从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类
pytorch·python·深度学习·机器学习·数据分析·cnn·transformer