Python类继承\uuu init__

Python类继承\uuu init__,python,class,Python,Class,所以,问题是 如果您这样做: class x(object): def __init__(self): pass 为什么要在子类中显式调用init,以访问父类属性?(y类仍然具有x类属性。) 干杯 编辑: 我读过这篇文章,它说“在现实生活中,我们倾向于为每一个父类运行初始值设定项。这只是,因为程序设计倾向于。在我们的简单示例中,解决这一问题的一种方法是显式调用a的初始值设定项:有人能解释一下吗?因为子类继承自父类,当然,这意味着一切:方法、属性和构造函数。 因此,不必重写所有的\u

所以,问题是

如果您这样做:

class x(object):
  def __init__(self):
    pass
为什么要在子类中显式调用init,以访问父类属性?(y类仍然具有x类属性。)

干杯

编辑:


我读过这篇文章,它说“在现实生活中,我们倾向于为每一个父类运行初始值设定项。这只是,因为程序设计倾向于。在我们的简单示例中,解决这一问题的一种方法是显式调用a的初始值设定项:有人能解释一下吗?

因为子类继承自父类,当然,这意味着一切:方法、属性和构造函数。 因此,不必重写所有的
\uuuu init\uuu
代码,只需使用父类中已经编写的代码即可。
希望它对您有意义。

因为子类继承自父类,当然,这意味着一切:方法、属性和构造函数。 因此,不必重写所有的
\uuuu init\uuu
代码,只需使用父类中已经编写的代码即可。
希望这对您有意义。

事实上,在python中,类和实例属性之间有着明显的区别:

  • 在类主体中声明的属性,在任何方法之外,都是类属性,它们对于该类的每个对象都是相同的,并且是由子类继承的属性。请注意,执行
    instance\u obj.class\u att=something
    不会更改class属性的值,而只是创建一个实例属性并隐藏该对象的共享class属性

  • 实例属性是用语法
    Instance_obj.att=something
    声明的属性,它们不在实例之间共享,与其他编程语言中的非静态属性最为相似,通常在init方法中创建。
    self
    只是一种约定,用于指示自动传递给方法的实例对象

下面是一个例子:

class MyClass:
    c = 1                    #class attribute, the subclasses will inherit this
    def __init__(self):
        self.i = 1           #instance attribute

MyClass.c     #access attribute c of class MyClass
MyClass.i     #error! MyClass has no attribute i
x = MyClass() #calling __init__ creates instance attribute i for obj x
x.i           #access instance attribute i of object x
x.c           #access class attribute c of class MyClass
x.c = 2       #hide MyClass.c and create instance attribute c for obj x
x.c           #access instance attribute c of obj x
总而言之,我们要做的是:

class y(x):
    def __init__(self):
        x.__init__(self)
是有用的,因为如果基类是这样的

class x:
    def __init__(self):
        self.i=1

您将无法从y的任何实例访问属性i,因为它们不具有该属性。

事实上,在python中,类属性和实例属性之间存在着明显的区别:

  • 在类主体中声明的属性,在任何方法之外,都是类属性,它们对于该类的每个对象都是相同的,并且是由子类继承的属性。请注意,执行
    instance\u obj.class\u att=something
    不会更改class属性的值,而只是创建一个实例属性并隐藏该对象的共享class属性

  • 实例属性是用语法
    Instance_obj.att=something
    声明的属性,它们不在实例之间共享,与其他编程语言中的非静态属性最为相似,通常在init方法中创建。
    self
    只是一种约定,用于指示自动传递给方法的实例对象

下面是一个例子:

class MyClass:
    c = 1                    #class attribute, the subclasses will inherit this
    def __init__(self):
        self.i = 1           #instance attribute

MyClass.c     #access attribute c of class MyClass
MyClass.i     #error! MyClass has no attribute i
x = MyClass() #calling __init__ creates instance attribute i for obj x
x.i           #access instance attribute i of object x
x.c           #access class attribute c of class MyClass
x.c = 2       #hide MyClass.c and create instance attribute c for obj x
x.c           #access instance attribute c of obj x
总而言之,我们要做的是:

class y(x):
    def __init__(self):
        x.__init__(self)
是有用的,因为如果基类是这样的

class x:
    def __init__(self):
        self.i=1

您将无法从y的任何实例访问属性i,因为它们没有该属性。

您应该使用super()方法,而不是显式调用init函数

在python 3.0+中,您可以使用:

在python 2.7或更低版本中,使用:


super()可以避免显式引用基类。

应该使用super()方法,而不是显式调用init函数

在python 3.0+中,您可以使用:

在python 2.7或更低版本中,使用:


super()允许您避免显式引用基类。

基类可能会更改。基类可能会更改。谢谢,但是如果基类attr更改,如您的示例中的
self.i=1
,调用x。
类y
中的_uuuinit_uuu(self)将获得
类y
的属性
i
,不是吗?@Roy i是实例属性,但当然,这就是你这么做的原因!Soz,
i
实例属性如何,如果它已经在
classx
中定义了???@Roy我已经编辑了我的答案,添加了另一个示例,我希望它能有所帮助。我建议您找到一个很好的参考资料,详细研究python中的OOP,以便更好地了解正在发生的事情。如果
\uuuu init\uuuu
除了调用
x之外什么都不做
y
将继承
x.\uuuu init\uuuu
。谢谢,但是如果基类attr发生了变化,比如在您的示例中
self.i=1
,调用x.
类y
中的\uuuu init\uuuuuuu(self)将获得
类y
的属性
i
,不是吗?@Roy i是一个实例属性,但当然,这就是您这样做的原因!Soz,
i
实例属性如何,如果它已经在
classx
中定义了???@Roy我已经编辑了我的答案,添加了另一个示例,我希望它能有所帮助。我建议您找到一个很好的参考资料,详细研究python中的OOP,以便更好地了解正在发生的事情。如果
\uuuu init\uuuu
除了调用
x之外什么都不做
y
将只继承
x.\uuuu init\uuuu