在Python中,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只在对象创建在内

正如标题所示,我正在努力理解Python中init构造函数的真正用途,特别是当我们创建一个从另一个(父)继承的类时。在阅读了“diveintopython”之后,我对B类从a继承到底会发生什么感到困惑

在以下示例中(取自此处:)

如果我们不调用父init
A.uu init_uuu(self,x)
,会发生什么

类B中是否仍存在属性x

此外,
Class B(A)
是否应该包含对父init的调用? 换句话说,我们是否可以跳过通话,如果我们这样做,后果会是什么

<> >代码> ItIthix只在对象创建在内存中之后才调用,不像C++。因此,它的真正目的只是初始化/创建实例变量

  • 如果不调用父级的
    \uuuu init\uuu
    ,它将不会创建变量
    x
    。请参见,我们作为第一个参数传递给父级的
    \uuuu init\uuuu
    调用的内容。我们传递当前对象(
    self
    )。现在,父对象的
    \uuuu init\uuuu
    在子对象上创建变量
    x

  • <> >代码> ItIthix只在对象创建在内存中之后才调用,不像C++。因此,它的真正目的只是初始化/创建实例变量

  • 如果不调用父级的
    \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是的,这些方法仍然存在,但可能会被破坏。