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

python的类装饰器

装饰器不仅可以用于函数,还能作用于类。将装饰器应用于类时,其核心原理与作用于函数类似,都是通过接收一个类作为输入,然后返回一个新的类或者修改后的原类,以此来为类添加额外的功能

简单的类装饰器

def add_method(cls):
    def new_method(self):
        print("这是新添加的方法")
    cls.new_method = new_method
    return cls

@add_method
class MyClass:
    def __init__(self):
        pass

obj = MyClass()
obj.new_method()

add_method 是一个类装饰器,它接收一个类 cls 作为参数
在装饰器内部,定义了一个新的方法 new_method,并将其添加到传入的类 cls 中
最后返回修改后的类 cls
使用 @add_method 装饰 MyClass 类,相当于执行了 MyClass = add_method(MyClass)
这样 MyClass 类就拥有了新添加的 new_method 方法

带参数的类装饰器

def add_attribute(attr_name, attr_value):
    def decorator(cls):
        setattr(cls, attr_name, attr_value)
        return cls
    return decorator

@add_attribute('new_attr', 123)
class AnotherClass:
    def __init__(self):
        pass

print(AnotherClass.new_attr)

add_attribute 是一个带参数的类装饰器,它接收两个参数 attr_name 和 attr_value,用于指定要添加的属性名和属性值
add_attribute 函数返回一个装饰器函数 decorator
decorator 函数接收类 cls 作为参数,使用 setattr 函数为类 cls 添加指定的属性
最后返回修改后的类 cls

使用 @add_attribute('new_attr', 123) 装饰 AnotherClass 类,为该类添加了一个名为 new_attr、值为 123 的属性

基于类的装饰器

class CountInstances:
    def __init__(self, cls):
        self.cls = cls
        self.instances_count = 0

    def __call__(self, *args, **kwargs):
        instance = self.cls(*args, **kwargs)
        self.instances_count += 1
        print(f"已创建 {self.instances_count}{self.cls.__name__} 类的实例")
        return instance

@CountInstances
class MyTestClass:
    def __init__(self):
        pass

obj1 = MyTestClass()
obj2 = MyTestClass()

CountInstances 是一个基于类的装饰器

__init__ 方法接收被装饰的类 cls 作为参数,并初始化一个实例计数器 instances_count
__call__ 方法使得 CountInstances 类的实例可以像函数一样被调用。在 __call__ 方法中,创建被装饰类的实例,同时更新实例计数器,并打印相关信息,最后返回创建的实例

使用 @CountInstances 装饰 MyTestClass 类,每次创建 MyTestClass 类的实例时,都会触发 CountInstances 类的 __call__ 方法,从而实现对实例创建次数的统计

@CountInstances 是装饰器语法,作用相当于执行了 MyTestClass = CountInstances(MyTestClass)
将 MyTestClass 类作为参数传递给 CountInstances 类的构造函数,得到一个 CountInstances 类的实例,然后将这个实例赋值给 MyTestClass

此时,MyTestClass 实际上变成了 CountInstances 类的实例,而不再是原来的 MyTestClass 类

相关文章:

  • 前端与后端的对接事宜、注意事项
  • FRRouting配置与OSPF介绍,配置,命令,bfd算法:
  • SpringBoot+数据可视化的奶茶点单购物平台(程序+论文+讲解+安装+调试+售后)
  • 【PostgreSQL】PG在windows下的安装
  • Linux 网络设备驱动中的 netdev_priv 函数详解
  • 【学习笔记】深度学习网络-深度模型中的优化
  • 垃圾回收器
  • Spring——Spring开发实战经验(1)
  • trl-强化学习训练-grpo训练为例
  • 网络接收的流程理解
  • [NKU]C++基础课(二)--- externC、强制类型转换、类与对象、面向对象程序设计语言、对象创建和使用、类的定义、封装
  • java死锁
  • 轮子项目--消息队列的实现(4)
  • openharmony系统移植之显示驱动框架从framebuffer升级为drm(linux-5.10)
  • 【Java】—— 包装类泛型
  • 【go语言规范】关于接口设计
  • 财务系统的开发需要注意哪些东西
  • Java-数据结构基础1
  • 【办公类-90-02】】20250215大班周计划四类活动的写法(分散运动、户外游戏、个别化综合)
  • LeeCode题库第十九题
  • 央行:下阶段将实施好适度宽松的货币政策
  • 中信银行:拟出资100亿元全资设立信银金融资产投资有限公司
  • OpenAI任命了一位新CEO
  • 纪念苏联伟大卫国战争胜利80周年阅兵彩排,解放军仪仗队亮相
  • 联想发布超级智能体矩阵,杨元庆:美国关税影响反映在产品定价上,未来不确定性很大
  • 美国与胡塞武装达成停火协议,美伊相向而行?