主页 > 互联网  > 

python的类装饰器

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 类

标签:

python的类装饰器由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“python的类装饰器