【Python】Python3 多继承的super init()问题

来源:互联网 发布:无间道3什么意思 知乎 编辑:程序博客网 时间:2024/06/08 19:08
class Song():    def __init__(self, author):        self._author = authorclass Singer():    def __init__(self, name):        self._name = nameclass Mtv(Song, Singer):    def __init__(self, name, author):        super().__init__(author)         # init Song        super(Song, self).__init__(name) # init Singermtv = Mtv('name', 'author')print('mtv._author =', mtv._author)print('mtv._name =', mtv._name)
# Mtv 的 MRO(<class '__main__.Mtv'>, <class '__main__.Song'>, <class '__main__.Singer'>, <class 'object'>)`# 运行结果mtv._author = authormtv._name = name
  • Song 跟 Singer 不必呼叫 super
  • super(type, obj_or_type) 会按照 MRO 的顺序去委托 type 的 父类 或 兄弟类 的方法来调用
    super().__init__(author) 会找到 <class '__main__.Song'> 并调用其 __init__(author)
    super(Song, self).__init__(name) 会找到 <class '__main__.Singer'>并调用其 __init__(name)

    不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类
    不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类
    不要一说到 super 就想到父类!super 指的是 MRO 中的下一个类

在 MRO 中,基类永远出现在派生类后面,如果有多个基类,基类的相对顺序保持不变。

原创粉丝点击