[英]Why inheritance in python require the parent class to inherit object explicitly?
以下是我的代码的两个版本:
不工作的人
class A:
def __init__(self):
print "I am A "
class B:
def __init__(self):
print "I am B "
class C(A, B):
def __init__(self):
super(C, self).__init__()
c = C()
这引发了异常:
super(C, self).__init__()
TypeError: must be type, not classobj
工作版本
class A(object):
def __init__(self):
print "I am A "
class B:
def __init__(self):
print "I am B "
class C(A, B):
def __init__(self):
super(C, self).__init__()
c = C()
如果父类之一显式继承了object ,则没有异常,并且一切正常。 任何解释,为什么?
通过上述工作 ,它将显示“我是A”而不显示“我是B”,这意味着它仅初始化A类,而不初始化B。如何在子类中初始化多个父类?
这是因为super
仅适用于新型类(继承自object
)。 在Python 2中, object
在继承层次结构中不存在的类(如您的第一个示例)被称为旧类,并且永远不要在任何地方使用。
这是从Python首次添加OO到开发人员弄错时的一个古老历史工件。 除其他外,新型类允许使用super
,描述符协议(属性),并对处理多重继承的方式进行了一些修复。 super
是其中之一,但最重要的是钻石继承案例(A继承自B和C都继承自D)的方法解析顺序的计算方式。 在此处了解更多信息: http : //python-history.blogspot.fr/2010/06/method-resolution-order.html
请注意,Python 3完全放弃了旧式类,因此在Python 3中,所有类都是新式类,并且从对象继承,而不管它们是否显式执行。
super()仅适用于新型类(任何从object继承的类)。因此您无法将class object传递给super
。
超级有两种典型的用例。 在具有单一继承的类层次结构中,super可以用于引用父类而无需显式命名它们,从而使代码更具可维护性。 这种用法与其他编程语言中super的用法非常相似。
第二个用例是在动态执行环境中支持协作式多重继承。 该用例是Python独有的,在静态编译语言或仅支持单继承的语言中找不到。 这使得在多个基类实现相同方法的情况下实现“菱形图”成为可能。 良好的设计要求该方法在每种情况下都具有相同的调用签名(因为调用的顺序是在运行时确定的,因为该顺序适合于类层次结构中的更改,并且因为该顺序可以包含在运行时之前未知的同级类)。
典型的超类调用如下所示:
class C(B):
def method(self, arg):
super(C, self).method(arg)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.