这是this question的后续行动:
Effective Java 2nd Edition,第17项:继承的设计和文档,或者禁止它:
为了允许继承,类必须遵守一些限制。构造函数不得直接或间接调用可覆盖的方法。如果违反此规则,将导致程序失败。超类构造函数在子类构造函数之前运行,因此在子类构造函数运行之前将调用子类中的重写方法。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期运行。
由于我们只是要触及Java构造函数的初始化方面,我认为在这个问题中将Java的构造函数与Python的__init__()
进行比较是安全的。
我猜是因为在Python
我可以灵活地决定何时调用(在这种情况下初始化我当前的类'数据属性之后)我的祖先__init__()
与Java super()
相比需要成为构造函数调用中的第一个语句,从__init__()
调用重写方法可能是安全的吗?
如果我在猜测上述内容时是正确的,那么作为一名祖先类设计师,我不会受到我的子类设计师的左右的影响吗?如果子类设计者在初始化他的数据属性之前调用了我的__init__()
,并且我会调用该方法,那么我会导致程序失败!
答案 0 :(得分:6)
我可以安全地从
__init__()
调用被覆盖的方法吗?
你是。在self
被评估之前,__init__()
绑定已经发生。
祖先类设计师受我的子类设计师左右的支配?
这是普遍正确的,与__init__()
或其他任何事情无关。
子类开发人员可以任何。此外,这是Python:他们有你的来源,也可以修改它。
如果子类设计者在初始化他的数据属性之前调用了我的
__init__()
,并且我会调用该方法,那么我会导致程序失败!
正确。这种情况发生的方式是子类设计者选择了一个你已经使用的名称。他们保证,通过选择名称,该计划将失败。