面向對象 - 多重繼承(一個類繼承多個類)
- 如果一個類有多個父類,而多個父類又有公共的父類(菱形/磚石繼承)
那麼在搜索屬性和方法時搜索的依據是c3算法(類似於廣度優先搜索)
這個是Python3中的一個改進,在此之前搜索的額算法是深度優先搜索(DFS)
- 在實際開發儘量避免多重繼承,無法避免的時候可以把除第一父類外的父類設定爲抽象類,子類在繼承的時候重寫方法
from abc import ABCMeta,abstractmethod
class Father(object):
def __init__(self, name):
self._name = name
def drink1(self):
print(self._name + '正在喝酒')
def gamble(self):
print(self._name + '正在賭博')
class Monk(object, metaclass=ABCMeta):
def __init__(self, name):
self._name = name
@abstractmethod
def eat_vegetable(self):
pass
@abstractmethod
def chant(self):
pass
class Musicion(object, metaclass=ABCMeta):
def __init__(self, name):
self._name = name
@abstractmethod
def drink2(self):
pass
@abstractmethod
def play_piano(self):
pass
class Son(Father, Monk, Musicion):
def __init__(self, name, nickname, artname):
Father.__init__(self, name)
self._nickname = nickname
self._artname = artname
def play_piano(self):
print(self._artname + '正在彈鋼琴')
def read(self):
print(self._nickname + '正在念經')
def drink1(self):
print(self._name + '正在喝五糧液')
def drink2(self):
print(self._artname + '正在喝王老吉')
def main():
son = Son('蓋小倫', '智空', '銀河之力')
son.drink()
# Musicion.drink(son)
son.chant()
son.play_piano()
if __name__ == '__main__':
main()