__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__
本身,例如当它没有(附加的)内部状态来初始化时,这是非常方便的。