【发布时间】:2015-12-06 02:22:34
【问题描述】:
我的班级层次结构是这样设置的,每个孩子的__init__()必须将self._init_has_run()设置为False,调用父母的__init__(),然后自己做__init__(),最后将self._init_has_run()设置为@987654327 @。我有以下代码:
class Parent:
def __init__(self, arg1, arg2):
pass # do stuff
def init(cls, fun):
def decorated_init(self, *args, **kwargs):
self._init_has_run = False
x = super()
super().__init__(*args, **kwargs)
fun(self, *args, **kwargs)
self._init_has_run = True
return decorated_init
class Child(Parent):
@Parent.init
def __init__(self, arg1, arg2):
pass # do stuff
由于有许多子类遵循与__init__() 相同的一般模式,而且我不知道如何使用元类,所以我使用装饰器来整合重复逻辑,然后仅将该装饰器应用于所有后代__init__() 方法。
Python 抛出以下内容:
File "filename.py", line 82, in decorated_init
super().__init__(*args, **kwargs)
TypeError: object.__init__() takes no parameters
我通过调试器确认self._init_has_run 的切换工作正常并且super() 正在解析为Parent 类,但是当装饰器尝试调用super().__init__(*args, **kwargs) 时,为什么Python 会尝试调用object.__init__()?
【问题讨论】:
标签: python python-3.x decorator python-decorators