2010-03-10 44 views
36

假设我有一个Base类和一个Child类继承自Base。从Python中的子类调用基类构造函数的正确方法是什么?我是否使用super如何从Python中的继承类正确调用基类方法(和构造函数)?

这里是我到目前为止的例子:

class Base(object): 
    def __init__(self, value): 
     self.value = value 
    ... 

class Child(Base): 
    def __init__(self, something_else): 
     super(Child, self).__init__(value=20) 
     self.something_else = something_else 
    ... 

这是正确的吗?

谢谢,Boda Cydo。

+4

伊格纳西奥,我测试了它,但也有其他的方式,例如,在'Child',我可以做'高清__init __(自我,something_else):基本.__的init __(值= 20)',我不知道我是否可以做到这一点......因此,我要求知道如何以现代Python的方式完全正确地做到这一点。 – bodacydo 2010-03-10 23:09:50

回答

39

这是正确的。请注意,您也可以直接拨打__init__方法上Base类,如下所示:

class Child(Base): 
    def __init__(self, something_else): 
     Base.__init__(self, value = 20) 
     self.something_else = something_else 

这是我一般做的方式。但是它很沮丧,因为它在多重继承的情况下表现不佳。当然,多重继承有它自己的各种奇怪效果,所以我避免它像瘟疫一样。

一般来说,如果你使用的类继承使用super,你也需要。

+0

感谢您描述这两种方法。我不确定“Base .__ init__”。 – bodacydo 2010-03-10 23:11:39

+0

你能否在示例中添加除“value”之外的其他参数?订单是否重要?如果价值被赋予价值会怎样? – ragerdl 2016-02-02 02:01:59

11

是的,这是正确的。如果你希望能够通过valueChild类,你可以这样来做

class Child(Base): 
    def __init__(self, value, something_else): 
     super(Child, self).__init__(value) 
     self.something_else = something_else 
    ... 
+0

感谢您演示如何将值传递给Child,然后将此值传递给Base! – bodacydo 2010-03-10 23:11:17

+0

您还需要确保Child的所有超类都可以接受该值,并将其传递,因为通常情况下,您无法确定Base是否是下一个调用的值。 – 2010-03-10 23:25:07

18

如果你使用的是Python 3.1,超强的是新的和改进。它为你指出了类和实例的参数。所以,你应该叫超级无参数:

class Child(Base): 
    def __init__(self, value, something_else): 
     super().__init__(value) 
     self.something_else = something_else 
    ... 
相关问题