如何从Python继承的类中正确调用基类方法(和构造函数)?

How to correctly call base class methods (and constructor) from inherited classes in Python?

本问题已经有最佳答案,请猛点这里访问。

假设我有一个Base类和一个从Base继承的Child类。在Python中,从子类调用基类的构造函数的正确方法是什么?我使用super吗?

以下是迄今为止我所拥有的一个例子:

1
2
3
4
5
6
7
8
9
10
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
   ...

这是正确的吗?

谢谢,博达·赛多。


没错。注意,您也可以直接在Base类上调用__init__方法,如下所示:

1
2
3
4
class Child(Base):
    def __init__(self, something_else):
        Base.__init__(self, value = 20)
        self.something_else = something_else

这就是我通常的做法。但这是不鼓励的,因为它在多重继承的情况下表现不太好。当然,多重继承本身有各种奇怪的影响,所以我像避免瘟疫一样避免它。

一般来说,如果您从使用super继承的类,也需要这样做。


如果您使用的是python 3.1,super是新的和改进的。它为您计算出类和实例参数。因此,您应该调用super而不带参数:

1
2
3
4
5
class Child(Base):
    def __init__(self, value, something_else):
        super().__init__(value)
        self.something_else = something_else
    ...


是的,没错。如果你想把value交给Child班,你可以这样做。

1
2
3
4
5
class Child(Base):
   def __init__(self, value, something_else):
       super(Child, self).__init__(value)
       self.something_else = something_else
   ...