如何初始化基类(父类)?
在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)
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
派生)。