为什么在类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__()
WordCounter.__init__
中调用super().__init__(text)
等同于super(WordCounter, self).__init__(text)
。这两个参数的意思是“使用self
的mro,从WordCounter
开始”。我们习惯于看到self
的类型为WordCounter
或单一继承自它。当不是这种情况时,WordCounter
的父类可能不是mro中的下一个元素,就像你在这里看到的那样。这就是答案中“super()
的作用是调用此__mro__
中的下一个方法”的句子的含义。 - Mad Physicist