多重繼承 除了從一個父類繼承外,Python允許從多個父類繼承,稱為多重繼承。 多重繼承的繼承鏈就不是一棵樹了,它像這樣: class A(object): def __init__(self, a): print 'init A...' self.a = a class B(A): def __init__(self, a): super(B, self).__init__(a) print 'init B...' class C(A): def __init__(self, a): super(C, self).__init__(a) print 'init C...' class D(B, C): def __init__(self, a): super(D, self).__init__(a) print 'init D...' 看下圖: 像這樣,D 同時繼承自 B 和 C,也就是 D 擁有了 A、B、C 的全部功能。多重繼承通過 super()調用__init__()方法時,A 雖然被繼承了兩次,但__init__()只調用一次: >>> d = D('d') init A... init C... init B... init D... 多重繼承的目的是從兩種繼承樹中分別選擇並繼承出子類,以便組合功能使用。 舉個例子,Python的網絡服務器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服務器運行模式有 多進程ForkingMixin 和 多線程ThreadingMixin兩種。 要創建多進程模式的 TCPServer: class MyTCPServer(TCPServer, ForkingMixin) pass 要創建多線程模式的 UDPServer: class MyUDPServer(UDPServer, ThreadingMixin): pass 如果沒有多重繼承,要實現上述所有可能的組合需要 4x2=8 個子類。 任務 +-Person +- Student +- Teacher 是一類繼承樹; +- SkillMixin +- BasketballMixin +- FootballMixin 是一類繼承樹。 通過多重繼承,請定義“會打籃球的學生”和“會踢足球的老師”。 ?不會了怎么辦 多重繼承需要從兩個或更多的類派生。 參考代碼: class Person(object): pass class Student(Person): pass class Teacher(Person): pass class SkillMixin(object): pass class BasketballMixin(SkillMixin): def skill(self): return 'basketball' class FootballMixin(SkillMixin): def skill(self): return 'football' class BStudent(Student, BasketballMixin): pass class FTeacher(Teacher, FootballMixin): pass s = BStudent() print s.skill() t = FTeacher() print t.skill()
