python3 多继承的super init问题
本文介绍了python3 多继承的super init问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
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方法里,如何是的两个父类进行初始化,并且完成属性赋值?
解决方案
使用 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'>)`
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)
結果:
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
这篇关于python3 多继承的super init问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文