Python class 装饰器,不能使用构造器

Python class decorator, cannot use constructor

所以我有以下装饰器代码

class Factory:

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

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

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

以及以下 class 代码

@Factory
class Foo:

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

    def method(self): pass

效果很好。允许我做类似

的事情

Foo.Produce().method()

而不是

instance = Foo()
instance.method()

但是现在无法正常使用class构造器

Foo(arg)

给出异常'Factory object is not callable'。我的问题如下:如何制作一个装饰器,允许我使用其构造函数实例化装饰的 class,但也允许我在装饰器中使用函数?

我不想使用的替代方法:

  1. 跳过构造函数。始终使用 <Class>.Produce()(并使用 *args/**kwargs 使其成为 abstract/reusable.
  2. 在所有 classes 中使用 setter,并使它们 return self 以便它们可以链接起来。
  3. 创建一个包含 produce 方法的 class 并扩展这个 class。

异常告诉你所有你需要知道的,只需添加一个__call__方法:

class Factory:
    # ...

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

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

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