python之多重繼承

多重繼承 即一個類繼承自多個類,之後該類就可以擁有其父類的屬性了

 

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'

感覺上面的內容有點亂 ><!      下面總結下:

多重繼承中,父類子類有同名函數時:

  1. 子類的實例對象調用子類的該方法時,結果爲:先輸出父類的該函數內容,再輸出子類的。若父類還有父類,即爺爺類(表達較搞笑,爲了方便表達,理解理解哈),則先輸出爺爺類的方法,再父類方法,最後子類方法。
  2. 子類中書寫的繼承類順序,在子類實例對象調用其方法時,只能調用第一個繼承類的一系列的該方法。(繼承類的順序我們按由左至右的順序算的哈)

多重繼承中,父類子類有不同名函數時:

  1. 子類的實例對象可以調用其自身的方法,也能調用父類的方法。
  2. 父類的實例對象不能調用其子類的方法。

歡迎大家留言,一起交流學習。我的個人公衆號爲:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章