在Python中进行类继承时init的真正目的

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__的呼叫,然后尝试

1
2
b = B()
print(b.x)

你会得到一个例外。

一般来说,在调用它的__init__时,不必命名超类—您可以在python 3中使用super(B, self).__init__(x)或仅使用super().__init__(x)


  • EDCOX1的0Ω仅在对象在内存中创建之后才被调用,不像C++。因此,它的真正目的是只初始化/创建实例变量。

  • 如果不调用父级的__init__,它将不会创建变量x。请看,我们将把什么作为第一个参数传递给父级的__init__调用。我们传递当前对象(self)。现在,父对象的__init__在子对象上创建变量x