python3 多继承的super init问题
伊谢尔伦
伊谢尔伦 2017-04-18 09:24:13
[Python讨论组]

python中,如果存在多继承,例如

class Song(object):
    """docstring for Song"""
    def __init__(self, author):
        super(Song, self).__init__(author)
        self._author = author
class Singer(object):
    """docstring for Singer"""
    def __init__(self, name):
        super(Singer, self).__init__(name)
        self._name = name
class Mtv(Song, Singer):
    """docstring for RockSong"""
    def __init__(self, name, author):
        super(RockSong, self).__init__(name)

Mtv继承song与singer,在init方法里,如何是的两个父类进行初始化,并且完成属性赋值?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(2)
PHPz

使用 super() 的辦法:

class Song(object):
    def __init__(self, author):
        self._author = author

class Singer(object):
    def __init__(self, name):
        self._name = name

class Mtv(Song, Singer):
    def __init__(self, name, author):
        super().__init__(author) # init Song
        super(Song, self).__init__(name) # init Singer

mtv = 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'>)`
  • SongSinger 不必呼叫 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)

結果:

mtv._author = author
mtv._name = name

P.S. 如果你是使用 Python3, 那一般的 class 不必繼承 object


這篇講的很棒, 完全理解 super: 理解 Python super

直接補上文章中的精華:

  • super 及他的兩個參數在做甚麼:

def super(cls, inst):
    mro = inst.__class__.mro()
    return mro[mro.index(cls) + 1]
  • MRO 的順序

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


我回答過的問題: Python-QA

伊谢尔伦

跟你继承的顺序有关,会先调第一个父类Song的构造,假设Song也继承了某个类X,那么再会调X的构造。完事之后再回来调Singer的构造。类似深度优先的原则

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号