【发布时间】:2018-05-04 00:36:38
【问题描述】:
我正在尝试制作一个自动调用父类 init 的装饰器。它适用于单继承,但是当我尝试链接效果时,出现堆栈溢出错误。谁能解释(a)为什么会发生这种情况以及(b)如何完成我想要完成的事情?
def init(__init):
def wrapper(self, *args, **kwargs):
self.__class__.__bases__[0].__init__(self)
__init(self)
return wrapper
class Base:
def __init__(self):
print("base init")
class Parent(Base):
@init
def __init__(self):
print("parent init")
class Child(Parent):
@init
def __init__(self):
print("child init")
a = Parent() #works
#c = Child() #stack overflow
【问题讨论】:
-
看看第二种情况下
self.__class__是什么。它将永远是Parent,因为self永远不会停止成为Child的实例,无论您调用什么方法。 -
您希望引用包含您正在调用的
__init的类。这将确保您的递归最终终止。 -
这个装饰器到底有什么意义???
-
不要费心让这个装饰器工作。这将是一段充满陷阱的艰难旅程。只需像其他人一样在构造函数中调用父
__init__。无论如何,它只比输入@init长几个字符。 -
@Rawing。我希望我在回答中抓住了你的情绪。
标签: python reflection decorator