我是多重和多级继承的新手。我试图执行一个示例:
class First(object):
def __init__(self):
super().__init__()
print("first")
class Second(object):
def __init__(self):
super().__init__()
print("second")
class Third(First, Second):
def __init__(self):
super().__init__()
print("third")
Third()
我得到的输出是:
second
first
third
<__main__.Third at 0x21bbaf2fc88>
谁能给我解释一下输出的原因吗?我原以为输出是:
first
second
third
由于第三类的__init__((将调用第一类的__nit__(((因为它在父列表中是第一个(,它将首先打印第二类的__init((,然后打印第三类。
MRO打印出我所期望的。
print(Third.__mro__)
打印
(__main__.Third, __main__.First, __main__.Second, object)
如果在调用print(xxx)
之前执行super().__init__()
,则显示的顺序是正确的。
如果你想在"excepted"选项卡中显示订单,你可以用super().__init__()
交换每个print(xxx)
,这样就会解决问题。
代码:
class First(object):
def __init__(self):
print("first")
super().__init__()
class Second(object):
def __init__(self):
print("second")
super().__init__()
class Third(First, Second):
def __init__(self):
print("third")
super().__init__()
Third()
这似乎只是在__init__
中打印时的一个工件。当前代码在调用super().__init__
之后打印,因此继承层次结构以相反的顺序打印出来。如果在超级调用之前打印,它将与MRO的顺序相同。如果你双向打印,也许最容易理解:
class First(object):
def __init__(self):
print("first (top)")
super().__init__()
print("first (bottom)")
class Second(object):
def __init__(self):
print("second (top)")
super().__init__()
print("second (bottom)")
class Third(First, Second):
def __init__(self):
print("third (top)")
super().__init__()
print("third (bottom)")
现在Third()
的输出应该是:
third (top)
first (top)
second (top)
second (bottom)
first (bottom)
third (bottom)
您看到的<__main__.Third ...>
输出不是由任何代码打印的,而是由交互式shell打印的。这是调用类的实例Third
的结果。如果执行instance = Third()
,则不会看到这种情况,因为值将存储到变量中,而不会打印出来。REPL(Read Eval Print Loop(仅在Python以交互方式运行时运行,它不会在导入或作为脚本运行的模块中进行任何额外的打印。