所以我有以下装饰器代码
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)
给出例外'工厂对象不可调用'。我的问题如下:我如何制作一个允许我使用其构造函数实例化装饰类的装饰器,还允许我在装饰器中使用一个函数?
我不想使用的其他方式:
<Class>.Produce()
(并使用*args
/ **kwargs
使其成为抽象/可重复使用。self
,以便它们可以被链接。答案 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