The true purpose of init when it comes to class inheritance in Python
正如标题所示,我正在努力理解Python中init构造函数的真正用途,特别是当我们创建从另一个(父)继承的类时。在经历了"diveintopython"之后,我对类B从A继承时到底会发生什么有点困惑。
在下面的示例中(从这里开始:直接调用uuu init_uuu的目的是什么?)
1 2 3 4 5 6 7 8 9 10
| class A:
def __init__(self, x):
self.x = x
class B(A):
def __init__(self, x, y):
A.__init__(self, x)
self.y = y |
如果我们不调用父级init A.__init__(self, x),会发生什么?
属性x是否仍存在于类B中?
此外,难道Class B(A)不应该已经需要调用parent init吗?换言之,我们是否可以跳过呼叫,如果我们这样做,后果会是什么?
如果您不调用__init__,那么不,x在类B的实例上将不存在。江户十一〔十〕不会运行,因为你从来没有打过电话!
class B(A)是指B继承A的财产,但在您创建B的实例时,它不会自动调用A的构造函数。这意味着您可以控制自己是否需要它——通常您应该调用构造函数,但您可以选择是否需要它。结果取决于您要子类化的类——可能没有问题,或者您的代码可能根本不起作用。在这种情况下,如我所说,如果您跳过对A.__init__的呼叫,然后尝试
你会得到一个例外。
一般来说,在调用它的__init__时,不必命名超类—您可以在python 3中使用super(B, self).__init__(x)或仅使用super().__init__(x)。
- 因此,如果我跳过对init的调用(因此不使用属性x生存),是否仍然可以继承类A方法(即使它们最终被破坏)?
- @Konos5是的,方法仍然存在,但可能会被破坏。
EDCOX1的0Ω仅在对象在内存中创建之后才被调用,不像C++。因此,它的真正目的是只初始化/创建实例变量。
如果不调用父级的__init__,它将不会创建变量x。请看,我们将把什么作为第一个参数传递给父级的__init__调用。我们传递当前对象(self)。现在,父对象的__init__在子对象上创建变量x。