以下是我的代码的两个版本:
不工作的人
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”,这意味着它仅初始化Class A,而不初始化ClassB。如何在子类中初始化多个父类?
super()仅适用于新型类(任何从object继承的类)。因此您不能将class object传递给super
。
超级有两种典型的用例。在具有单一继承的类层次结构中,super可以用于引用父类而无需显式命名它们,从而使代码更具可维护性。这种用法与其他编程语言中super的用法非常相似。
第二个用例是在动态执行环境中支持协作式多重继承。该用例是Python特有的,在静态编译语言或仅支持单继承的语言中找不到。这样就可以在多个基类实现相同方法的情况下实现“菱形图”。良好的设计要求该方法在每种情况下都具有相同的调用签名(因为调用的顺序是在运行时确定的,因为该顺序可以适应类层次结构中的更改,并且该顺序可以包含在运行时之前未知的同级类)。
典型的超类调用如下所示:
class C(B):
def method(self, arg):
super(C, self).method(arg)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句