在Python中,init在类继承方面的真正用途
正如标题所示,我正在努力理解Python中init构造函数的真正用途,特别是当我们创建一个从另一个(父)继承的类时。在阅读了“diveintopython”之后,我对B类从a继承到底会发生什么感到困惑 在以下示例中(取自此处:) 如果我们不调用父init在Python中,init在类继承方面的真正用途,python,inheritance,constructor,init,Python,Inheritance,Constructor,Init,正如标题所示,我正在努力理解Python中init构造函数的真正用途,特别是当我们创建一个从另一个(父)继承的类时。在阅读了“diveintopython”之后,我对B类从a继承到底会发生什么感到困惑 在以下示例中(取自此处:) 如果我们不调用父initA.uu init_uuu(self,x),会发生什么 类B中是否仍存在属性x 此外,Class B(A)是否应该包含对父init的调用? 换句话说,我们是否可以跳过通话,如果我们这样做,后果会是什么 >代码> ItIthix只在对象创建在内
A.uu init_uuu(self,x)
,会发生什么
类B中是否仍存在属性x
此外,Class B(A)
是否应该包含对父init的调用?
换句话说,我们是否可以跳过通话,如果我们这样做,后果会是什么
\uuuu init\uuu
,它将不会创建变量x
。请参见,我们作为第一个参数传递给父级的\uuuu init\uuuu
调用的内容。我们传递当前对象(self
)。现在,父对象的\uuuu init\uuuu
在子对象上创建变量x
\uuuu init\uuu
,它将不会创建变量x
。请参见,我们作为第一个参数传递给父级的\uuuu init\uuuu
调用的内容。我们传递当前对象(self
)。现在,父对象的\uuuu init\uuuu
在子对象上创建变量x
如果不调用
\uuuu init\uuuu
,则类B
的实例上不存在x
<代码>A.。\uuuu init\uuuu将不会运行,因为您从未调用过它
class B(A)
意味着B
继承自A
,但在创建B
的实例时,它不会自动调用A
的构造函数。这意味着您可以自己控制是否需要它——您通常应该调用构造函数,但您可以选择是否需要。结果取决于您正在子类化的类-可能没有问题,或者您的代码可能根本不工作。在这种情况下,正如我所说,如果您跳过对A.\uuu init\uuu
的调用,然后重试
b = B()
print(b.x)
你会得到一个例外
一般来说,在调用其
\uuuuu init\uuuuu
时,您不必命名超类-您可以使用super(B,self)。\uuuu init\uuuuuuuux
或只需super()。\uuuu init\uuuuuux
如果您不调用\uuu init\uuuuuucode>,则不,x
将不存在于类B
的实例上<代码>A.。\uuuu init\uuuu
将不会运行,因为您从未调用过它
class B(A)
意味着B
继承自A
,但在创建B
的实例时,它不会自动调用A
的构造函数。这意味着您可以自己控制是否需要它——您通常应该调用构造函数,但您可以选择是否需要。结果取决于您正在子类化的类-可能没有问题,或者您的代码可能根本不工作。在这种情况下,正如我所说,如果您跳过对A.\uuu init\uuu
的调用,然后重试
b = B()
print(b.x)
你会得到一个例外
一般来说,在调用超类的
\uuuuu init\uuuuuu
时,您不必命名超类-您可以使用super(B,self)。\uuuu init\uuuuuuuuuux
,或者在Python 3中使用super()。\uuuu init\uuuuuuuuuuux
,因此如果我跳过对init的调用(因此没有属性x),我仍然可以继承类a方法吗(即使它们最终被破坏)@Konos5是的,这些方法仍然存在,但可能会被破坏。因此,如果我跳过对init的调用(因此没有属性x),我是否仍然可以继承类A方法(即使它们最终被破坏)@Konos5是的,这些方法仍然存在,但可能会被破坏。