2011-05-16 78 views
3

虽然学习Python中我有过的使用继承类的初始化语法有些混乱。在各种例子我见过类似如下:Python的__init__语法

class Foo(Bar): 
    def __init__(self, arg, parent = None): 
     Bar.__init__(self, parent) 
     self.Baz = arg 
     etc. 

虽然有时它只是

class Foo(Bar): 
    def __init__(self, arg): 
     Bar.__init__(self) 
     etc. 

一个何时需要确保使用“父”作为参数初始化函数?谢谢。

回答

7

一般通过parent不是唯一的需要的东西,只有当父类的构造函数中明确需要这样的说法。这用于一些层次结构中,如PyQt。

和父类初始化的一个很好的成语是使用super

class Child(Father): 
    def __init__(self): 
    super(Child, self).__init__() 
+0

但是'超()'只与新样式类作品在Python 2,或Python 3。它不与老式类在Python 2.工作确保您的基类是一种新型的类(继承自'object')。 – Keith 2011-05-16 07:22:32

+0

@Keith:正确的,虽然使用老式类不建议这些天,因为它是一个很老的功能 – 2011-05-16 07:30:48

+0

没错,但有些人仍然这样做和OP似乎是遵循老的例子。所以我想我会指出,以防万一。 – Keith 2011-05-16 08:44:40

2

在您的例子变量“父”是一种误导。只要父类可以要求必须提供

class Pet: 
    def __init__(self,name): 
     self.name = name 

class Dog(Pet): 
    def __init__(self,name,age): 
     Pet.__init__(self,name) 
     self.age = age 

在这个例子中,父类宠物需要的属性(名称)额外的参数,而子类提供它

正如指出的那样,用“超级“语法来调用父类的方法