超级真的在python中做了什么

时间:2013-12-05 07:04:04

标签: python object initialization

我刚读过GvR的Method Resolution Order,但我想知道Python's Super is nifty, but you can't use it中是否有以下陈述(我同意这一点)。那么super()会导致调用MRO中的下一个方法吗?另请注意this comment

  

'超级'的一个大问题是它听起来会导致它   superclass要调用的方法的副本。这根本不是   case,它会导致MRO中的下一个方法被调用(...)

class A(object):
    def __init__(self):
        #super(A, self).__init__()
        print 'init A'

class B(object):
    def __init__(self):
        print 'init B'

class C(A, B):
    def __init__(self):
        super(C, self).__init__()
        print 'init C'

c = C()

给出

init A
init C

虽然

class A(object):
    def __init__(self):
        super(A, self).__init__()
        print 'init A'

class B(object):
    def __init__(self):
        print 'init B'

class C(A, B):
    def __init__(self):
        super(C, self).__init__()
        print 'init C'

c = C()

给出

init B
init A
init C

1 个答案:

答案 0 :(得分:1)

看起来两种情况下的预期结果......在第一种情况下,C调用A(MRO中的下一个类)打印“init A”并返回,因此流程返回到C,打印出“init C”并返回。匹配您的输出。

在第二种情况下,C调用A(MRO中的下一个)调用B(MRO中的A旁边)打印“init B”并返回,因此流程返回到A,打印出“init A”并返回到C打印“init C”。