使用装饰器向类添加方法

时间:2015-01-11 16:42:38

标签: python class decorator

如何在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

我知道这可以通过子类化基类来实现,但我希望能够使用装饰器来完成。

2 个答案:

答案 0 :(得分:2)

你需要做两件事:

  1. myDecorator返回传递它的类对象:

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

    否则,装饰器默认会返回None,只要您TypeError尝试拨打MyClass(),您就会获得None

  2. myFunction接受self参数:

    def myFunction(self):
        return 'X'
    

    只要您在班级的实例上调用它,就会隐式传递。

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

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