2017-04-02 112 views
1

所以,这里的问题..Python类继承__init__

,如果你这样做:

class x(object): 
    def __init__(self): 
    pass 

为什么你会显式调用初始化子类来访问父类的属性? (无论如何,y类都具有x类属性。)

class y(x): 
    def __init__(self): 
    x.__init__(self) 

干杯。

编辑:

我看了这篇文章https://linuxmeerkat.wordpress.com/2015/04/28/why-you-should-use-super-in-python/,它说:“在现实生活中,我们往往会运行每一个父类的初始化这简直是,因为程序设计如何往往是在我们的简单。举例来说,解决这个问题的一个方法是明确地调用A的初始化方法:“有人可以解释吗?

+0

的基类可能会改变。 –

回答

0

的事实是,在蟒蛇有类和实例之间有明显的区别属性:在类体内声明

  • 属性,任何方法外,有类属性,它们是相同的该类的每个对象都是由子类继承的对象。请注意,做instance_obj.class_att = something不会更改类属性的值,但只是创建实例属性并隐藏该对象的共享类属性。

  • 实例属性是声明语法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只是因为他们不会拥有它。

+0

谢谢,但如果基类ATTR改变,就像在你的榜样'self.i = 1',称X .__初始化__在'类y'(个体经营)将获得属性'i'为'类y',是不是? – Roy

+0

@Roy我是一个实例属性,但肯定,这就是你这样做的原因! – andre

+0

Soz,如果'class'中已经定义了'我'是一个实例属性? – Roy

0

因为子类继承父类,当然,这意味着它的永恒性:方法,属性和构造函数。 因此,不要重写所有的__init__代码,而只需使用已经写在父类中的内容。 希望它对你有意义。

0

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

在蟒蛇3.0+,你可以使用jusy:

class y(x): 
    def __init__(self): 
     super().__init__() 

在蟒蛇2.7或以下,使用:

class y(x): 
    def __init__(self): 
     super(self.__class__, self).__init__() 

超()可以让你避免提及到基类明确。