我有一些类,它们的方法我想可以随意地添加到其他类中。我最初的解决方案是使用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...which似乎将方法和类方法适当地添加到修饰类中。但是,当我在修饰类上调用这些添加的方法(或类方法)之一时,我会得到一些错误。
关于方法:
>>> Schedule().humanize()
TypeError: unbound method humanize() must be called with Humanizer instance as first argument (got type instance instead)...which似乎表明这些是作为类方法添加的?
对于类方法:
>>> 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'>所以,我的问题是:
装饰函数中有什么问题会导致这些添加的方法和类方法表现得很奇怪呢?或者,更好地说,我如何修改装饰功能以正确处理这些添加?
请让我知道,如果我可以提供任何澄清的任何一点。
发布于 2012-11-12 00:09:17
假设这是个好主意。这是你实现它的一种方式。不过,我不能说我会提出建议。
def horrible_class_decorator_factory(mixin):
def decorator(cls):
d = cls.__dict__.copy()
bases = tuple([b for b in cls.__bases__ if b != object] + [mixin])
return type(cls.__name__, bases, d)
return decorator现在你可以这样做了:
class Inferer(object):
@classmethod
def foo(cls):
return "bar" + cls.__name__
inferer = horrible_class_decorator_factory(Inferer)
@inferer
class X(object):
pass
X.foo()
"barX"我和评论员一起写这篇文章。你能做点什么并不意味着你应该这么做。
https://stackoverflow.com/questions/13336768
复制相似问题