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,但也允许我在装饰器中使用函数?
我不想使用的替代方法:
- 跳过构造函数。始终使用
<Class>.Produce()
(并使用 *args
/**kwargs
使其成为 abstract/reusable.
- 在所有 classes 中使用 setter,并使它们 return
self
以便它们可以链接起来。
- 创建一个包含 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
所以我有以下装饰器代码
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,但也允许我在装饰器中使用函数?
我不想使用的替代方法:
- 跳过构造函数。始终使用
<Class>.Produce()
(并使用*args
/**kwargs
使其成为 abstract/reusable. - 在所有 classes 中使用 setter,并使它们 return
self
以便它们可以链接起来。 - 创建一个包含 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