如何在Python中使用装饰器向类中添加方法?我的目标是让使用我的装饰器的类有一个可用的方法。
这是一个简化的例子。我希望instance.dec_added_func()
返回'X'
:
>>> def myFunction():
... return 'X'
...
>>> myFunction()
'X'
>>> def myDecorator(cls):
... cls.dec_added_func = myFunction
...
>>> @myDecorator
... class MyClass(object):
... a = 'A'
...
>>> instance = MyClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
我知道这可以通过子类化基类来实现,但我希望能够使用装饰器来完成。
答案 0 :(得分:2)
你需要做两件事:
让myDecorator
返回传递它的类对象:
def myDecorator(cls):
cls.dec_added_func = myFunction
return cls
否则,装饰器默认会返回None
,只要您TypeError
尝试拨打MyClass()
,您就会获得None
。
让myFunction
接受self
参数:
def myFunction(self):
return 'X'
只要您在班级的实例上调用它,就会隐式传递。
以下是演示:
>>> def myFunction(self):
... return 'X'
...
>>> def myDecorator(cls):
... cls.dec_added_func = myFunction
... return cls
...
>>> @myDecorator
... class MyClass(object):
... a = 'A'
...
>>> instance = MyClass()
>>> instance.dec_added_func()
'X'
>>>
答案 1 :(得分:0)
对于一个简短的方法,如果您认为lambda更具可读性,也可以考虑使用它:
def myDecorator(cls):
cls.dec_added_func = lambda self: 'X'
return cls
将==
运算符添加到具有value
字段的类的另一个示例:
def equals(cls):
cls.__eq__ = lambda self, other: self.value == other.value
return cls