Python-繼承

一恭理、繼承的概念


Python面向?qū)ο蟮睦^承指的是多個類之間的所屬關(guān)系聚至,即子類默認(rèn)繼承父類的屬性和方法

# 父類A 
class A(object): 
    def __init__(self): 
        self.num = 1 
    def info_print(self): 
        print(self.num) 

# 子類B 
class B(A): 
    pass 

# 創(chuàng)建對象庐扫,驗(yàn)證結(jié)論 
result = B() 
result.info_print() # 1

在Python中,所有類默認(rèn)繼承object類,object類是頂級類或基類;其他子類叫做派生類

二炼杖、單繼承


  • 逍遙派掌門人無崖子決定在離世之前將一身絕學(xué)傳給虛竹
  • 分析:徒弟是不是要繼承師父的所有武功?
# 1. 師父類 
class Master(object): 
      def __init__(self): 
            self.kongfu = '[北冥神功]' 
      def beiming(self): 
            print(f'虛竹運(yùn)用{self.kongfu}擊敗敵人') 

# 2. 徒弟類 
class Prentice(Master): 
      pass # 

3. 創(chuàng)建對象
xuzhu xuzhu = Prentice() 

# 4. 對象訪問實(shí)例屬性 
print(xuzhu.kongfu) 

# 5. 對象調(diào)用實(shí)例方法 
xuzhu.beiming()  # 虛竹運(yùn)用[北冥神功]擊敗敵人

三碟渺、多繼承


所謂多繼承意思就是一個類同時(shí)繼承了多個父類

  • 虛竹在繼承無崖子功力之前叔扼,曾是少林寺僧人览徒,會些許少林武功
class XiaoYao(object): 
      def __init__(self): 
            self.wugong = '[北冥神功]' 
      def kongfu(self): 
            print(f'運(yùn)用{self.wugong}擊敗敵人') 

# 少林武功 
class ShaoLin(object): 
      def __init__(self): 
            self.wugong = '[波若掌]' 
      def kongfu(self): 
            print(f'運(yùn)用{self.wugong}擊敗敵人')
class Prentice(ShaoLin, XiaoYao): 
      pass 
xuzhu = Prentice() 
print(xuzhu.wugong) 
xuzhu.kongfu() # 運(yùn)用[波若掌]擊敗敵人

注意:當(dāng)一個類有多個父類的時(shí)候狈定,默認(rèn)使用第一個父類的同名屬性和方法。

四习蓬、子類重寫父類同名方法和屬性


  • 虛竹潛心修煉自創(chuàng)逍遙游
    class XiaoYao(object): 
        def __init__(self): 
              self.wugong = '[北冥神功]' 
        def kongfu(self): 
              print(f'運(yùn)用{self.wugong}擊敗敵人') 
    # 少林武功 
    class ShaoLin(object): 
          def __init__(self): 
                self.wugong = '[波若掌]' 
          def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
    class Prentice(ShaoLin, XiaoYao): 
          def __init__(self): 
                self.wugong = '[逍遙游]' 
          def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
    
    xuzhu = Prentice() 
    print(xuzhu.wugong) 
    xuzhu.kongfu() # 運(yùn)用[逍遙游]擊敗敵人 
    
    print(Prentice.__mro__) # 查看一個類繼承的父類以及層級關(guān)系
    
    子類和父類具有同名屬性和方法纽什,默認(rèn)使用子類的同名屬性和方法。

五躲叼、子類調(diào)用父類的同名方法和屬性


  • 喬峰想要領(lǐng)教一下三弟虛竹的武功芦缰,于是虛竹使出了渾身解數(shù)
    # 逍遙派武功 
    class XiaoYao(object): 
          def __init__(self): 
                self.wugong = '[北冥神功]' 
          def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
    # 少林武功 
    class ShaoLin(object): 
          def __init__(self): 
                self.wugong = '[波若掌]' 
          def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
    
    class Prentice(ShaoLin, XiaoYao): 
          def __init__(self): 
                self.wugong = '[逍遙游]' 
          def kongfu(self): 
                self.__init__() 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
          def xiaoyao_kongfu(self): 
                XiaoYao.__init__(self) 
                XiaoYao.kongfu(self) 
          def shaolin_kongfu(self): 
                ShaoLin.__init__(self) 
                ShaoLin.kongfu(self) 
    xuzhu = Prentice() 
    # print(xuzhu.wugong) 
    # xuzhu.kongfu() 
    xuzhu.xiaoyao_kongfu() 
    xuzhu.shaolin_kongfu() 
    xuzhu.kongfu()
    

六、多層繼承


  • 多年后虛竹想要將武功再傳下去枫慷,挑選了一位徒弟
    class XiaoYao(object): 
          def __init__(self): 
                self.wugong = '[北冥神功]' 
          def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人')
    class ShaoLin(object): 
          def __init__(self): 
                self.wugong = '[波若掌]' 
          def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
    class Prentice(ShaoLin, XiaoYao): 
          def __init__(self): 
                self.wugong = '[逍遙游]' 
          def kongfu(self): 
                self.__init__() 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
          def xiaoyao_kongfu(self): 
                XiaoYao.__init__(self) 
                XiaoYao.kongfu(self) 
          def shaolin_kongfu(self): 
                ShaoLin.__init__(self) 
                ShaoLin.kongfu(self) 
    class TuDi(Prentice): 
          pass 
    tudi = TuDi() 
    tudi.kongfu() 
    tudi.shaolin_kongfu() 
    tudi.xiaoyao_kongfu()
    

七让蕾、super()調(diào)用父類方法


# 逍遙派武功 
class XiaoYao(object): 
        def __init__(self): 
              self.wugong = '[北冥神功]' 
        def kongfu(self): 
              print(f'運(yùn)用{self.wugong}擊敗敵人') 

# 少林武功 
class ShaoLin(XiaoYao): 
        def __init__(self): 
              self.wugong = '[波若掌]' 
        def kongfu(self): 
              print(f'運(yùn)用{self.wugong}擊敗敵人') 

              # super()
              # 2.1 帶參數(shù) 
              # super(ShaoLin,self).__init__() 
              # super(ShaoLin,self).kongfu() 

              #2.2 無參數(shù) 
              super().__init__() 
              super().kongfu() 

class Prentice(ShaoLin): 
        def __init__(self): 
              self.wugong = '[逍遙游]' 
        def kongfu(self): 
              self.__init__() 
              print(f'運(yùn)用{self.wugong}擊敗敵人') 
        def xiaoyao_kongfu(self): 
              XiaoYao.__init__(self) 
              XiaoYao.kongfu(self) 
        def shaolin_kongfu(self): 
              ShaoLin.__init__(self) 
              ShaoLin.kongfu(self) 
        # 一次性調(diào)用兩個父類的方法 
        def two_kongfu(self): 
              # 方法一:如果類型修改,這里代碼也要修改或听,而且如果代碼量龐大探孝,會很麻煩,幾乎都是冗余的 代碼 
              # XiaoYao.__init__(self) 
              # XiaoYao.kongfu(self) 
              # ShaoLin.__init__(self) 
              # ShaoLin.kongfu(self) 
  
              # 方法二:super() 
              # 2.1誉裆、super(當(dāng)前類名,self).函數(shù)() 
              # super(Prentice,self).__init__() 
              # super(Prentice,self).kongfu() 

              # 2.2顿颅、super() 無參數(shù) 
              super().__init__() 
              super().kongfu() 
  xuzhu = Prentice() 
  xuzhu.two_kongfu()

另外,子類的對象屬性不能超過其各個父類屬性個數(shù)的最大值足丢,如果不同父類有不同的屬性定義元镀,子類
需要全部繼承時(shí),需要使用args霎桅,*kwargs不定長參數(shù)使父類的屬性個數(shù)不定長,此時(shí)子類繼承時(shí)能
獲得所有的屬性讨永。

class XiaoYao(object): 
        def __init__(self,*args,**kwargs): 
              self.wugong = '[北冥神功]' 
              self.music = '[達(dá)拉崩吧]' 
              super().__init__(*args,**kwargs) 

        def kongfu(self):
              print(f'運(yùn)用{self.wugong}擊敗敵人')
  # 少林武功 
  class ShaoLin(object): 
        def __init__(self,*args,**kwargs): 
                self.wugong = '[波若掌]' 
                super().__init__(*args,**kwargs) 

        def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
  
  class Prentice(ShaoLin, XiaoYao): 
        def __init__(self): 
              super().__init__() 
  xuzhu = Prentice() 
  print(xuzhu.wugong) 
  print(xuzhu.music)

八滔驶、私有權(quán)限


8.1 定義私有屬性和私有方法

在Python中,可以為實(shí)例屬性和方法設(shè)置私有權(quán)限卿闹,即設(shè)置某個實(shí)例屬性或?qū)嵗椒ú焕^承給子類揭糕。
設(shè)置私有權(quán)限的方法:在屬性名和方法名 前面 加上兩個下劃線 __萝快。

  • 虛竹臨終前,不想把自己的錢給徒弟
    class XiaoYao(object): 
          def __init__(self): 
                self.wugong = '[北冥神功]' 
    
          def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
    
    class ShaoLin(object): 
          def __init__(self): 
                self.wugong = '[波若掌]' 
          def kongfu(self): 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
    
    class Prentice(ShaoLin, XiaoYao): 
          def __init__(self): 
                self.wugong = '[逍遙游]' 
                self.__money = 200000 
          def kongfu(self): 
                self.__init__() 
                print(f'運(yùn)用{self.wugong}擊敗敵人') 
          def __info_print(self):
                print("私有方法")
    class TuDi(Prentice): 
          pass 
    tudi = TuDi() print(tudi.__money) # 報(bào)錯 
    tudi.__info_print() # 報(bào)錯
    
    注意:稀有屬性和私有方法只能在類里面訪問和修改
8.2 獲取和修改私有屬性值
class XiaoYao(object): 
      def __init__(self): 
            self.wugong = '[北冥神功]' 

      def kongfu(self): 
            print(f'運(yùn)用{self.wugong}擊敗敵人') 
class ShaoLin(object): 
      def __init__(self): 
            self.wugong = '[波若掌]' 
      def kongfu(self): 
            print(f'運(yùn)用{self.wugong}擊敗敵人') 

class Prentice(ShaoLin, XiaoYao): 
      def __init__(self): 
            self.wugong = '[逍遙游]' 
            self.__money = 200000 
      def kongfu(self): 
            self.__init__() 
            print(f'運(yùn)用{self.wugong}擊敗敵人') 
      # 獲取私有屬性 
      def get_money(self): 
            return self.__money 
      # 修改私有屬性 
      def set_money(self): 
            self.__money = 500 
      def __info_print(self): 
            print('私有方法') 
class TuDi(Prentice): 
      pass 
tudi = TuDi()
print(tudi.get_money()) 
tudi.set_money() 
print(tudi.get_money())
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末著角,一起剝皮案震驚了整個濱河市揪漩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吏口,老刑警劉巖奄容,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異产徊,居然都是意外死亡昂勒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門舟铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戈盈,“玉大人,你說我怎么就攤上這事谆刨√寥ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵痊夭,是天一觀的道長刁岸。 經(jīng)常有香客問我,道長生兆,這世上最難降的妖魔是什么难捌? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮鸦难,結(jié)果婚禮上根吁,老公的妹妹穿的比我還像新娘。我一直安慰自己合蔽,他們只是感情好击敌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拴事,像睡著了一般沃斤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刃宵,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天衡瓶,我揣著相機(jī)與錄音,去河邊找鬼牲证。 笑死哮针,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播十厢,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼等太,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛮放?” 一聲冷哼從身側(cè)響起缩抡,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎包颁,沒想到半個月后瞻想,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡徘六,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年内边,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片待锈。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡漠其,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竿音,到底是詐尸還是另有隱情和屎,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布春瞬,位于F島的核電站柴信,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宽气。R本人自食惡果不足惜随常,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萄涯。 院中可真熱鬧绪氛,春花似錦、人聲如沸涝影。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燃逻。三九已至序目,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伯襟,已是汗流浹背猿涨。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姆怪,地道東北人嘿辟。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓舆瘪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親红伦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355