【发布时间】:2015-04-19 02:03:56
【问题描述】:
我正在研究 Python 的超级方法和多重继承。我读到类似当我们使用 super 调用在所有基类中都有实现的基方法时,即使有各种参数,也只会调用一个类的方法。例如,
class Base1(object):
def __init__(self, a):
print "In Base 1"
class Base2(object):
def __init__(self):
print "In Base 2"
class Child(Base1, Base2):
def __init__(self):
super(Child, self).__init__('Intended for base 1')
super(Child, self).__init__()# Intended for base 2
这将为第一个 super 方法生成 TyepError。 super 将调用它首先识别的任何方法实现并提供TypeError,而不是检查其他类。但是,当我们执行以下操作时,这将更加清晰并且可以正常工作:
class Child(Base1, Base2):
def __init__(self):
Base1.__init__(self, 'Intended for base 1')
Base2.__init__(self) # Intended for base 2
这就引出了两个问题:
-
__init__方法是静态方法还是类方法? - 为什么要使用 super,它隐式地自行选择方法,而不是像后一个示例那样显式调用方法?对我来说,它看起来比使用 super 更干净。那么使用
super比第二种方式有什么好处(除了用方法调用写基类名)
【问题讨论】:
-
它是一个类方法(如果我理解正确,也就是实例方法)。静态没有 self 作为第一个参数。 Super 通常更好,因为您不需要知道基类的名称。
-
但是如果我们要使用基类方法,最好知道我们调用的是哪个类方法,就多重继承而言,对吧?
-
第二个代码不可能正常工作。另外,
super()不是这样工作的,调用 super 两次并不意味着它会自动调用 MRO 中的下一个类。 -
这是一个特例。但是对于构造函数不带参数时的多重继承,super从left to right调用基类构造函数
-
感谢@AshwiniChaudhary...更新了第二个代码的问题
标签: python python-2.7 inheritance multiple-inheritance