面向对象 - 多重继承(一个类继承多个类)
- 如果一个类有多个父类,而多个父类又有公共的父类(菱形/砖石继承)
那么在搜索属性和方法时搜索的依据是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()