使用装饰器向 类 添加一个方法
Add a method to classes with a decorator
如何在 Python 中使用装饰器向 class 添加方法?我的目标是让 class 使用我的装饰器的 es 有一个可用的方法。
这是一个简化的例子。我想要 instance.dec_added_func()
到 return '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
我知道这可以通过 subclass 基础 class 来完成,但我希望能够通过装饰器来完成。
你需要做两件事:
有myDecorator
return它传递的class对象:
def myDecorator(cls):
cls.dec_added_func = myFunction
return cls
否则,默认情况下装饰器将 return None
并且当您尝试调用 None
时 MyClass()
时您将得到 TypeError
。
使 myFunction
接受一个 self
参数:
def myFunction(self):
return 'X'
只要您在 class.
的实例上调用它,它就会被隐式传递
下面是演示:
>>> 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'
>>>
对于一个简短的方法,如果你觉得可读性更好,也可以考虑使用lambda:
def myDecorator(cls):
cls.dec_added_func = lambda self: 'X'
return cls
将 ==
运算符添加到具有 value
字段的 class 的另一个示例:
def equals(cls):
cls.__eq__ = lambda self, other: self.value == other.value
return cls
如何在 Python 中使用装饰器向 class 添加方法?我的目标是让 class 使用我的装饰器的 es 有一个可用的方法。
这是一个简化的例子。我想要 instance.dec_added_func()
到 return '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
我知道这可以通过 subclass 基础 class 来完成,但我希望能够通过装饰器来完成。
你需要做两件事:
有
myDecorator
return它传递的class对象:def myDecorator(cls): cls.dec_added_func = myFunction return cls
否则,默认情况下装饰器将 return
None
并且当您尝试调用None
时MyClass()
时您将得到TypeError
。使
myFunction
接受一个self
参数:def myFunction(self): return 'X'
只要您在 class.
的实例上调用它,它就会被隐式传递
下面是演示:
>>> 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'
>>>
对于一个简短的方法,如果你觉得可读性更好,也可以考虑使用lambda:
def myDecorator(cls):
cls.dec_added_func = lambda self: 'X'
return cls
将 ==
运算符添加到具有 value
字段的 class 的另一个示例:
def equals(cls):
cls.__eq__ = lambda self, other: self.value == other.value
return cls