__init __()调用父类的__init __()?

我在Objective-C中使用了这个构造:

- (void)init { if (self = [super init]) { // init class } return self; } 

Python是否也为__init__调用父类的实现?

 class NewClass(SomeOtherClass): def __init__(self): SomeOtherClass.__init__(self) # init class 

这是__new__()__del__()是真/假?

编辑:有一个非常类似的问题: 在Python中inheritance和覆盖__init__

在Python中,调用超类“ __init__是可选的。 如果您调用它,那么是否使用super标识符也是可选的,或者是否显式指定超类:

 object.__init__(self) 

在对象的情况下,由于super方法是空的,调用super方法并不是必须的。 相同__del__

OTOH,对于__new__ ,你应该确实调用超级方法,并使用它的返回作为新创build的对象 – 除非你明确地要返回不同的东西。

如果你需要从super的__init__中除了在当前类的__init__,做什么以外__init__,你必须自己调用它,因为这不会自动发生。 但是如果你不需要super的__init__,任何东西__init__,就不需要调用它。 例:

 >>> class C(object): def __init__(self): self.b = 1 >>> class D(C): def __init__(self): super().__init__() # in Python 2 use super(D, self).__init__() self.a = 1 >>> class E(C): def __init__(self): self.a = 1 >>> d = D() >>> da 1 >>> db # This works because of the call to super's init 1 >>> e = E() >>> ea 1 >>> eb # This is going to fail since nothing in E initializes b... Traceback (most recent call last): File "<pyshell#70>", line 1, in <module> eb # This is going to fail since nothing in E initializes b... AttributeError: 'E' object has no attribute 'b' 

__del__是一样的(但是要谨慎,依靠__del__来完成 – 考虑通过with语句来代替)。

我很less使用__new__. 我在__init__.做了所有的初始化__init__.

在Anon的回答中:
“如果你需要从super的__init__中除了在当前类的__init__做什么以外,你必须自己调用它,因为这不会自动发生”

这是不可思议的:他的措辞恰恰与inheritance原则相反。

这不是说“超级__init__ (…)中的东西不会自动发生” ,而是它会自动发生,但不会发生,因为基类“ __init__被派生types的定义所覆盖, clas __init__

那么,为什么定义一个derived_class' __init__ ,因为它覆盖了什么是当有人采取inheritance的目的?

这是因为我们需要定义一些在基类“ __init__ ”中没有做的事情,唯一可能的就是把它的执行放在派生类的__init__函数中。
换句话说, 除了基类“ __init__自动完成的内容之外,还需要基类“ __init__中的某些内容,如果后者未被覆盖。
不相反。

然后,问题是在基类“ __init__中出现的所需指令在实例化时不再被激活。 为了抵消这种失活,需要一些特殊的东西:显式地调用基类“ __init__ ,以便KEEP ,NOT TO ADD,由基类“ __init__ ”执行的初始化。 这正是官方文档中所说的:

派生类中的重写方法事实上可能需要扩展而不是简单地replace同名的基类方法 。 有一个简单的方法直接调用基类方法:只需调用BaseClassName.methodname(self,arguments)。
http://docs.python.org/tutorial/classes.html#inheritance

这就是所有的故事:

  • 当目标是保持由基类执行的初始化,那就是纯inheritance,没有什么特别需要,我们必须避免在派生类中定义一个__init__函数

  • 当目标是replace由基类执行的初始化时,必须在派生类中定义__init__

  • 当目标是ADD进程到由基类执行的初始化时,必须定义一个派生类' __init__ ,包括对基类__init__的显式调用

令我感到惊讶的是,阿农的performance不仅与传承理论相反,而且还有5个人过了头就不发毛,而且2年内没有人反应过一个有趣的主题必须经常阅读的线程。

编辑 :(代码更改后)
我们无法告诉您是否需要调用父母的__init__ (或任何其他函数)。 显然,inheritance没有这样的呼吁。 这一切都取决于你的代码的逻辑:例如,如果你所有的__init__在父类中完成,你可以完全跳过子类__init__

考虑下面的例子:

 >>> class A: def __init__(self, val): self.a = val >>> class B(A): pass >>> class C(A): def __init__(self, val): A.__init__(self, val) self.a += val >>> A(4).a 4 >>> B(5).a 5 >>> C(6).a 12 

没有硬性规定。 类的文档应该指出子类是否应该调用超类方法。 有时候,你想完全replace超类的行为,而在其他时候则需要增加 – 即在超类调用之前和/或之后调用你自己的代码。

更新:相同的基本逻辑适用于任何方法调用。 构造函数有时需要特别的考虑(因为它们经常设置决定行为的状态)和析构函数,因为它们并行的构造函数(例如在资源分配中,例如数据库连接)。 但是,也可能适用于小部件的render()方法。

进一步更新:什么是OPP? 你的意思是OOP? 否 – 子类通常需要了解超类的devise。 不是内部的实现细节 – 而是超类与客户的基本合约(使用类)。 这并不违反OOP原则。 这就是为什么protected在OOP中是一个有效的概念(当然,在Python中并不是这样)。

国际海事组织,你应该叫它。 如果你的超类是object ,你不应该,但在其他情况下,我认为这是不例外的。 正如已经被其他人回答的那样,如果你的类甚至不需要重载__init__本身,例如当它没有(附加的)内部状态来初始化时,这是非常方便的。