super()在多级和多级继承中的用法



我是多重和多级继承的新手。我试图执行一个示例:

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以交互方式运行时运行,它不会在导入或作为脚本运行的模块中进行任何额外的打印。

相关内容

  • 没有找到相关文章

最新更新