1. 程式人生 > >Python3中面向物件------繼承

Python3中面向物件------繼承

     以下是我對Python3面向物件------繼承的理解,因為博主也是初學Python3,有很多東西都還停留在表層的理解,如果我的部落格有任何錯誤,請及時評論或者私信我,我會及時更改。也歡迎同樣學習Python的你願意關注我的部落格,我會把我每週的學習內容進行整理和上傳,方便大家溝通和交流學習經驗。


Python3面向物件--------繼承:

           (1)繼承與多重繼承

                     繼承:

                            通俗理解  子承父業
                     好處:

                            減少程式碼量,父類寫了子類就不用再寫,繼承以後子類就擁有了父類所有的功能

                     多重繼承:
                           
                     那麼子類功能多還是父類功能多呢?   

                            答案肯定是子類

                     什麼情況下使用繼承:

                             當多個類出現相同程式碼的時候可以抽出一個父類(但是最好滿足通俗的誰是誰的關係,)
                             一個類預設繼承的是object(),object()可以說是所有類的祖宗了。


                     多重繼承:

                             1.在繼承中允許出現兒子-父親-爺爺這種關係,
                                如果出現這種間接繼承關係的時候我們一般叫做多重繼承 
                             2.python支援多繼承
                             3.一個子類可以繼承多個父類,(自然也就獲得了多個父類所有的屬性)
                             4.父類與父類之間用逗號隔開
                             5.如果括號內父類中出現相同名字的函式,就執行就近原則,哪個父類在前,先執行誰的建構函式
 

class Father1:

    def playMajiang(self):
        print("打麻將")
    def eat(self):
        print("吃飯1")

class Father2:

    def playCard(self):
        print("鬥地主")
    def eat(self):
        print("吃飯2")

class son(Father2,Father1):
    pass

s=son()
s.playMajiang()
s.playCard()
s.eat()

執行結果:打麻將
                  鬥地主
                  吃飯2

上邊的程式碼就展現了多重繼承,當Father2和Father1中具有相同的函式名時,根據括號內父類的先後,執行最前面的。

         (2)繼承建構函式的問題

                  1.類中的建構函式不能繼承(def __init__(self):)
                  2.如果建立子類時寫了建構函式會覆蓋了父類的建構函式
                  3. 如果在子類中要使用父類的變數,必須先手動呼叫父類   super().__init__(self)
                  4.呼叫父類構造時,最好把呼叫語句放在最前面,讓父類構造先執行
                  5.子類構造有引數時,父類最好也有。
                  6.繼承最好少用,因為程式一般遵循高內聚低耦合的形式就是說類與類之間最好不產生聯絡,
                     如果類與類之間聯絡過多,會極大限制程式的擴充套件性

下邊看個案例:

           案例效果:
                   姓名:王飛  年齡:30 性別:男 工齡:5年
                   我承諾我會認真教課
                   王飛愛玩象棋

                   姓名:小明 年齡:15 性別:男 學號:0023102
                   我承諾我會好好學習
                   小明愛踢足球
                  

            案例分析:
                  1.    從案例效果分析有老師和學生2個事物,老師裡面有姓名、年齡、性別、工齡幾個變數。
                  2.    學生裡面有姓名、年齡、性別、學號幾個變數。
                  3.    老師裡面有講課、玩和顯示資訊的show方法。
                  4.    學生裡面有學習、玩和顯示資訊的show方法
                  5.    分析老師和學生裡面公有的東西抽象出一個父類出來,將公有的東西寫在父類中
                  6.    在主函式中建立一個老師和一個學生並完成賦值。
  先建立類,並找出類中相同的屬性抽出一個父類:

#先找出兩者共同的屬性,抽象出父類,寫出父類的建構函式
class Father:
    def __init__(self,name,age,sex,favorite,promise):
        self.name = name
        self.age = age
        self.sex = sex
        self.favorite = favorite
        self.promise = promise
#建立教師類 注意建構函式引數的傳遞
class Teather(Father):
    def __init__(self,name,age,sex,favorite,promise,gl):
        super().__init__(name,age,sex,favorite,promise)
        self.gl = gl
    def show(self):
        print('姓名:{},年齡:{},性別:{},工齡:{}'.format(self.name,self.age,self.sex,self.gl))
        print('我承諾,我會好好{}'.format(self.promise))
        print('{}愛玩{}'.format(self.name,self.favorite))
#建立學生類 注意建構函式引數的傳遞
class Student(Father):
    def __init__(self,name,age,sex,favorite,promise,xh):
        super().__init__(name,age,sex,favorite,promise)
        self.xh = xh
    def show(self):
        print('姓名:{},年齡:{},性別:{},學號:{}'.format(self.name,self.age,self.sex,self.xh))
        print('我承諾,我會好好{}'.format(self.promise))
        print('{}愛玩{}'.format(self.name,self.favorite))

  建立好之後,建立相應的物件

t1 = Teather('王飛',30,'男','象棋','教課',5)
t1.show()

s1 = Student('小米',18,'男','足球','讀書',1501010088)
s1.show()

做完這個案例之後,我們應該對Python3中繼承的相關知識有了一部分了解,拿到題之後,先分析題目有幾個類,類中物件有什麼屬性和行為,如果類中有相同的屬性和行為就可以抽出一個父類,從而減少了程式碼量,在子類中使用父類變數時,一定要記得先呼叫父類,呼叫方法是super().__init__(),要把呼叫放在最前面的位置,類中不同的屬性和行為,可以在各自類中的建構函式中建立相應變數。