Python中關(guān)于面向?qū)ο笾欣^承的詳細講解
1.繼承
在程序中,繼承描述的是多個類之間的所屬關(guān)系。
如果一個類A里面的屬性和方法可以復(fù)用,則可以通過繼承的方式,傳遞到類B里。
那么類A就是基類,也叫做父類;類B就是派生類,也叫做子類。
案例:
# 父類 class A(object): def __init__(self): self.num=50 def print_num(self): print(self.num+100) # 子類 class B(A): pass b=B() print(b.num) b.print_num()
2.單繼承
子類只繼承一個父類
案例:
# 父類 class A(object): def __init__(self): self.car='20款奔馳' def print_car(self): print('老款%s'%self.car) # 子類 class B(A): pass a=A() print(a.car) a.print_car() b=B() print(b.car) b.print_car()
子類在繼承的時候,在定義類時,小括號()中為父類的名字
父類的屬性、方法,會被繼承給子類
3.多繼承
子類繼承多個父類
案例1:
# 父類 class A(object): def __init__(self): self.car='20款奔馳' def print_car(self): print('老款%s'%self.car) def lao_car(self): print('20的大奔') class B(object): def __init__(self): self.car='21款背馳' def print_car(self): print('新款%s'%self.car) def xin_car(self): print('21的大奔') # 子類 class C(A,B): pass c=C() print(c.car) c.print_car() c.lao_car() c.xin_car()
案例2:
# 父類 class A(object): def __init__(self): self.car='20款奔馳' def print_car(self): print('老款%s'%self.car) def lao_car(self): print('20的大奔') class B(object): def __init__(self): self.car='21款背馳' def print_car(self): print('新款%s'%self.car) def xin_car(self): print('21的大奔') # 子類 class C(B,A): pass c=C() print(c.car) # 執(zhí)行B的屬性 c.print_car() # 執(zhí)行B的方法 print(C.__mro__) # 子類的魔法屬性__mro__決定了屬性和方法的查找順序 c.lao_car() # 不重名不受影響 c.xin_car()
多繼承可以繼承多個父類,也繼承了所有父類的屬性和方法
注意:如果多個父類中有同名的 屬性和方法,則默認使用第一個父類的屬性和方法(根據(jù)類的魔法屬性mro的順序來查找)
多個父類中,不重名的屬性和方法,不會有任何影響。
4.子類重寫父類的同名屬性和方法
案例:
# 父類 class A(object): def __init__(self): self.car='20款奔馳' def print_car(self): print('老款%s'%self.car) class B(object): def __init__(self): self.car='21款背馳' def print_car(self): print('新款%s'%self.car) # 子類 class C(B,A): def __init__(self): self.car='22款奔馳' def print_car(self): print('最新款%s'%self.car) c=C() print(c.car) # 執(zhí)行B的屬性 c.print_car() # 執(zhí)行B的方法 print(C.__mro__) # 子類的魔法屬性__mro__決定了屬性和方法的查找順序
5.子類調(diào)用父類同名屬性和方法
案例:
# 父類 class A(object): def __init__(self): self.car='20款奔馳' def print_car(self): print('老款%s'%self.car) class B(object): def __init__(self): self.car='21款背馳' def print_car(self): print('新款%s'%self.car) # 子類 class C(B,A): def __init__(self): self.car='22款奔馳' def print_car(self): print('執(zhí)行子類的__init__方法前,self.car的屬性:%s'%self.car) self.__init__() # 執(zhí)行本類的__init__方法,屬性初始化 print('執(zhí)行子類的__init__方法前,self.car的屬性:%s' % self.car) print('最新款%s'%self.car) def print_lao_car(self): print('執(zhí)行A的__init__方法前,self.car的屬性:%s' % self.car) A.__init__(self) # 執(zhí)行本類的__init__方法,屬性初始化 print('執(zhí)行A的__init__方法前,self.car的屬性:%s' % self.car) A.print_car(self) def print_xin_car(self): print('執(zhí)行B的__init__方法前,self.car的屬性:%s' % self.car) B.__init__(self) # 執(zhí)行本類的__init__方法,屬性初始化 print('執(zhí)行B的__init__方法前,self.car的屬性:%s' % self.car) B.print_car(self) c=C() c.print_car() print('*'*10) c.print_lao_car() print('*'*10) c.print_xin_car() print('*'*10) c.print_car()
6.多層繼承
class A(object): def __init__(self): self.car='20款奔馳' def print_car(self): print('老款%s'%self.car) class B(object): def __init__(self): self.car='21款奔馳' def print_car(self): print('新款%s'%self.car) class C(B,A): def __init__(self): self.car='22款奔馳' self.money=40 def print_car(self): self.__init__() print('最新款%s'%self.car) def print_lao_car(self): A.__init__(self) # 執(zhí)行A類的__init__方法,屬性初始化 A.print_car(self) def print_xin_car(self): B.__init__(self) # 執(zhí)行B類的__init__方法,屬性初始化 B.print_car(self) class D(C): # 多層繼承 pass d=D() d.print_car() d.print_lao_car() d.print_xin_car()
7.調(diào)用父類方法super()
案例:
class Animal(object): def play(self): print('動物就是玩') class Dog(Animal): def play(self): super().play() print('狗改不了吃屎') d=Dog() d.play()
8.案例
class Gupiao(object): def xinqing(self): print('股票買入和賣出') class Gongmu(Gupiao): def lianghua(self): super().xinqing() print('公募機構(gòu)買入和賣出') class Simu(Gupiao): def lianghua(self): Gupiao.__init__(self) Gupiao.xinqing(self) print('私募機構(gòu)買入和賣出') def xinqing(self): print('專研自己的輸出股票和私募買入和賣出') g=Gongmu() g.lianghua() print('*'*10) s=Simu() s.lianghua() s.xinqing()
到此這篇關(guān)于Python中關(guān)于面向?qū)ο笾欣^承的詳細講解的文章就介紹到這了,更多相關(guān)Python 面向?qū)ο?繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Django中修改js css文件但瀏覽器無法及時與之改變的問題
今天小編就為大家分享一篇解決Django中修改js css文件但瀏覽器無法及時與之改變的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python在不同目錄下導(dǎo)入模塊的實現(xiàn)方法
下面小編就為大家?guī)硪黄狿ython在不同目錄下導(dǎo)入模塊的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10聊聊python中令人迷惑的duplicated和drop_duplicates()用法
這篇文章主要介紹了聊聊python中令人迷惑的duplicated和drop_duplicates()用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05Python解析網(wǎng)頁源代碼中的115網(wǎng)盤鏈接實例
這篇文章主要介紹了Python解析網(wǎng)頁源代碼中的115網(wǎng)盤鏈接實例,主要采用了正則表達式re模塊來實現(xiàn)該功能,需要的朋友可以參考下2014-09-09Jupyter Notebook 實現(xiàn)正常顯示中文和負號
這篇文章主要介紹了Jupyter Notebook 實現(xiàn)正常顯示中文和負號,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04