为什么当我在类WordCounter
中调用super()
时,它调用类Vocabulary
,即使它不是从继承的?它不应该调用类Tokenizer
吗
class Tokenizer:
"""Tokenize text"""
def __init__(self, text):
print('Start Tokenizer.__init__()')
print('End Tokenizer.__init__()')
class Vocabulary(Tokenizer):
"""Find unique words in text"""
def __init__(self, text):
print('Start init Vocabulary.__init__()')
print('End init Vocabulary.__init__()')
class WordCounter(Tokenizer):
"""Count words in text"""
def __init__(self, text):
print('Start WordCounter.__init__()')
super().__init__(text)
print('End WordCounter.__init__()')
class TextDescriber(WordCounter, Vocabulary):
"""Describe text with multiple metrics"""
def __init__(self, text):
print('Start init TextDescriber.__init__()')
super().__init__(text)
print('End init TextDescriber.__init__()')
td = TextDescriber('row row row your boat')
输出:
Start init TextDescriber.__init__()
Start WordCounter.__init__()
Start init Vocabulary.__init__()
End init Vocabulary.__init__()
End WordCounter.__init__()
End init TextDescriber.__init__()
钻石遗产总是有点乱。每种语言都有自己的怪癖,Python也不例外。(注意,我在解释Python中的“新样式”类。Python 2中也有“经典”类,它们的行为不同)
Python对所有继承所做的是,如果当前类未实现请求的方法/属性,则呈现检查父类的顺序。您可以动态检查此方法的解析顺序。你的例子会产生效果
如您所见,Python选择从左到右,然后才在层次结构中下降(full details)
super()
所做的是调用这个__mro__
中的下一个方法。此链在Vocabulary.__init__()
处停止,因为此方法没有super().__init__()
调用使链继续如果在
Vocabulary.__init__()
中包含一个super().__init__()
调用,这将按预期工作:相关问题 更多 >
编程相关推荐