我有一些类的方法,我希望能够选择性地添加到其他类中。我最初的解决方案是使用 mixins,但这可能会有点难看:
class Schedule(Enumerator, Humanizer, Inferer, ...):
...
所以我想,嘿,也许我可以使用类装饰器来达到同样的效果。
@enumerator
@humanizer
@inferer
class Schedule(object):
...
这是装饰器功能的示例:
import inspect
def inferer(original_class):
from myproj.lib.inferer import Inferer
methods = inspect.getmembers(Inferer, predicate=inspect.ismethod)
for method in methods:
setattr(original_class, method[0], types.MethodTypes(method[1], original_class))
return original_class
...这似乎将方法和类方法适当地添加到装饰类中。但是,当我在装饰类上调用这些添加的方法(或类方法)之一时,会出现一些错误。
对于方法:
>>> Schedule().humanize()
TypeError: unbound method humanize() must be called with Humanizer instance as first argument (got type instance instead)
...这似乎表明这些是作为类方法添加的?
对于类方法:
>>> schedule = Schedule.infer(foo)
TypeError: infer() takes exactly 2 arguments (3 given)
注意推断的定义:
class Inferer(object):
@classmethod
def infer(cls, dates):
...
我添加了一些行来infer
显示它在调用时得到的参数Schedule.infer()
:
cls: <class 'myproj.lib.inferer.Inferer'>
dates: <class 'myproj.Schedule'>
所以,我的问题:
装饰器函数出了什么问题,导致这些添加的方法和类方法行为异常?或者,更好地说,如何修改装饰器函数以正确处理这些添加?
请让我知道我是否可以就任何问题提供任何澄清。