我想确保我正确理解装饰器作为类的工作原理。
假设我有一个装饰器作为向对象添加属性的函数
def addx(obj):
obj.x = 10
return obj
@addx
class A:
pass
assert A.x == 10
是否可以编写与类装饰器相同的装饰器?因为类装饰器无法使用__init__
class addx:
def __init__(self, obj):
obj.x = 10
# ???
答案 0 :(得分:1)
您可以像这样编写等效的基于类的装饰器...
class addx:
def __new__(self, obj):
obj.x = 10
return obj
@addx
class A:
pass
assert A.x == 10
...但是我不认为这真的能给您带来任何好处。当您的目标是修改class A
的对象而不是class A
本身时,基于类的装饰器的实用性就变得更加明显。比较以下两个修饰符,一个基于函数,一个基于类:
def addx_func(kls):
def wrapper():
res = kls()
res.x = 10
return res
return wrapper
class addx_class:
def __init__(self, kls):
self.kls = kls
def __call__(self):
res = self.kls()
res.x = 10
return res
@addx_func
class A:
pass
@addx_class
class B:
pass
a = A()
assert a.x == 10
b = B()
assert b.x == 10