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中,类和实例属性之间有着明显的区别:
- 在类主体中声明的属性,在任何方法之外,都是类属性,它们对于该类的每个对象都是相同的,并且是由子类继承的属性。请注意,执行
不会更改class属性的值,而只是创建一个实例属性并隐藏该对象的共享class属性instance\u obj.class\u att=something
- 实例属性是用语法
声明的属性,它们不在实例之间共享,与其他编程语言中的非静态属性最为相似,通常在init方法中创建。Instance_obj.att=something
只是一种约定,用于指示自动传递给方法的实例对象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中,类属性和实例属性之间存在着明显的区别:
- 在类主体中声明的属性,在任何方法之外,都是类属性,它们对于该类的每个对象都是相同的,并且是由子类继承的属性。请注意,执行
不会更改class属性的值,而只是创建一个实例属性并隐藏该对象的共享class属性instance\u obj.class\u att=something
- 实例属性是用语法
声明的属性,它们不在实例之间共享,与其他编程语言中的非静态属性最为相似,通常在init方法中创建。Instance_obj.att=something
只是一种约定,用于指示自动传递给方法的实例对象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
。