使用装饰器向 类 添加一个方法

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 来完成,但我希望能够通过装饰器来完成。

你需要做两件事:

  1. myDecoratorreturn它传递的class对象:

    def myDecorator(cls):
        cls.dec_added_func = myFunction
        return cls
    

    否则,默认情况下装饰器将 return None 并且当您尝试调用 NoneMyClass() 时您将得到 TypeError

  2. 使 myFunction 接受一个 self 参数:

    def myFunction(self):
        return 'X'
    

    只要您在 class.

  3. 的实例上调用它,它就会被隐式传递

下面是演示:

>>> 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