如何初始化基类(父类)?

175 投票
4 回答
235060 浏览
提问于 2025-04-16 04:02

在Python中,假设我有以下代码:

class SuperClass(object):
    def __init__(self, x):
        self.x = x
        
class SubClass(SuperClass):
    def __init__(self, y):
        self.y = y
        # how do I initialize the SuperClass __init__ here?

我该如何在子类中初始化SuperClass __init__呢?我在看Python教程时没有找到相关内容。当我在谷歌上搜索时,发现有好几种方法可以做到这一点。请问处理这个问题的标准方法是什么?

4 个回答

46

两者都可以用

SuperClass.__init__(self, x)

或者

super(SubClass,self).__init__( x )

我更喜欢第二种,因为它更符合“不要重复自己”的原则。

可以查看这里: http://docs.python.org/reference/datamodel.html#basic-customization

57

从Python 3.5.2开始,你可以使用:

class C(B):
def method(self, arg):
    super().method(arg)    # This does the same thing as:
                           # super(C, self).method(arg)

https://docs.python.org/3/library/functions.html#super

184

在Python(直到3版本)中,有“旧式”和“新式”类的概念。新式类是从object这个基础类派生出来的,实际上你使用的就是新式类,并且通过super()来调用它们的父类,比如:

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

  def doit(self, bar):
    pass

class Y(X):
  def __init__(self):
    super(Y, self).__init__(123)

  def doit(self, foo):
    return super(Y, self).doit(foo)

因为Python知道旧式和新式类的存在,所以调用父类的方法有不同的方式,这就是你发现有多种方法的原因。

为了完整起见,旧式类是通过显式地使用基类来调用父类的方法,也就是:

def doit(self, foo):
  return X.doit(self, foo)

但是既然你不应该再使用旧式类了,所以对此不必太在意。

Python 3只认识新式类(无论你是否从object派生)。

撰写回答