多重繼承 即一個類繼承自多個類,之後該類就可以擁有其父類的屬性了
class Person(object):
def __init__(self):
print 'person'
class Teacher(Person):
def __init__(self):
super(Teacher, self).__init__()
print 'teacher'
class Student(Person):
def __init__(self):
super(Student, self).__init__()
print 'student'
class Ball(object):
def __init__(self):
print 'ball'
class Basketball(Ball):
def __init__(self):
super(Basketball, self).__init__()
print 'basketball'
class Football(Ball):
def __init__(self):
super(Football, self).__init__()
print 'football'
class One(Student, Basketball):
def __init__(self):
super(One, self).__init__()
print '會籃球的學生'
class Two(Teacher, Football):
def __init__(self):
super(Two, self).__init__()
print '會足球的老師'
one = One()
==> person
==> student
==> 會籃球的學生
two = Two()
==> person
==> teacher
==> 會足球的老師
以上例子的解讀:Teacher與Student是Person的子類,Basketball與Football是Ball的子類。One繼承自Student與Basketball;Two繼承自Teacher與Football。所有的類中都有個名爲__init__()的函數。
因爲__init__()函數是在創建實例時自動調用的,所以在創建了One實例one時,系統自動調用One的__init__()函數,又因爲類One繼承自Student與Basketball,所以此時系統又會自動調用Student與Basketball的__init__()。在One類中,在寫繼承類時,書寫順序爲Student、Basketball,在調用__init__()時順序爲先Student父類Person中的__init__(),又Student的__init__(),最後One中的__init__()。Basketball中的__init__()方法沒有被調用。但如果調換Basketball與Student的順序,就類One1的情況(下面有代碼),此時只調用Basketball中的一系列類中的__init__()方法,順序爲自頭向下。
class One1(Basketball, Student):
def __init__(self):
super(One1, self).__init__()
print '會籃球的學生'
class Two2(Football, Teacher):
def __init__(self):
super(Two2, self).__init__()
print '會足球的老師'
one1 = One1()
==> ball
==> basketball
==> 會籃球的學生
two2 = Two2()
==> ball
==> football
==> 會足球的老師
以上是父類與子類有同名方法的情況,沒有同名方法時的情況是什麼呢?即子類的實例對象能調用父類的方法,但父類不能訪問子類的方法。
class Person(object):
def p(self):
print 'p'
class Teacher(Person):
def t(self):
print 't'
class Ball(object):
def b(self):
print 'b'
class Football(Ball):
def f(self):
print 'f'
class One(Teacher, Football):
def o(self):
print 't+f'
one = One()
one.o()
==> t+f
one.f()
==> f
one.t()
==> t
teacher = Teacher()
teacher.t()
==> t
teacher.p()
==> p
teacher.o()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Teacher' object has no attribute 'o'
感覺上面的內容有點亂 ><! 下面總結下:
多重繼承中,父類子類有同名函數時:
- 子類的實例對象調用子類的該方法時,結果爲:先輸出父類的該函數內容,再輸出子類的。若父類還有父類,即爺爺類(表達較搞笑,爲了方便表達,理解理解哈),則先輸出爺爺類的方法,再父類方法,最後子類方法。
- 子類中書寫的繼承類順序,在子類實例對象調用其方法時,只能調用第一個繼承類的一系列的該方法。(繼承類的順序我們按由左至右的順序算的哈)
多重繼承中,父類子類有不同名函數時:
- 子類的實例對象可以調用其自身的方法,也能調用父類的方法。
- 父類的實例對象不能調用其子類的方法。
歡迎大家留言,一起交流學習。我的個人公衆號爲: