Python类装饰器,不能使用构造函数

时间:2016-07-14 09:11:46

标签: python abstraction

所以我有以下装饰器代码

class Factory:

    def __init__(self, cls):
        self.cls = cls

    def __instancecheck__(self, inst):
        return isinstance(inst, self.cls)

    def Produce(self):
        return self.cls()

以及类代码

@Factory
class Foo:

    def __init__(self, arg):
        self.arg = arg

    def method(self): pass

哪个效果很好。允许我做像

这样的事情

Foo.Produce().method()

而不是

instance = Foo()
instance.method()

但现在我无法正常使用类构造函数

Foo(arg)

给出例外'工厂对象不可调用'。我的问题如下:我如何制作一个允许我使用其构造函数实例化装饰类的装饰器,还允许我在装饰器中使用一个函数?

我不想使用的其他方式:

  1. 跳过构造函数。始终使用<Class>.Produce()(并使用*args / **kwargs使其成为抽象/可重复使用。
  2. 在所有类中使用setter,并让它们返回self,以便它们可以被链接。
  3. 创建一个包含produce方法的类并扩展此类。

2 个答案:

答案 0 :(得分:2)

例外是告诉您需要知道的所有内容,只需添加__call__方法:

class Factory:
    # ...

    def __call__(self, *args, **kwargs):
        return self.cls(*args, **kwargs)

答案 1 :(得分:-1)

如果您只想在课程中添加Produce函数,则可以像这样重写装饰器:

def Factory(cls):
    def Produce():
        return cls()
    cls.Produce= Produce # add the function to the class
    return cls