Python中關(guān)于面向?qū)ο笾欣^承的詳細(xì)講解
1.繼承
在程序中,繼承描述的是多個(gè)類之間的所屬關(guān)系。
如果一個(gè)類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.單繼承
子類只繼承一個(gè)父類
案例:
# 父類
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()

子類在繼承的時(shí)候,在定義類時(shí),小括號(hào)()中為父類的名字
父類的屬性、方法,會(huì)被繼承給子類
3.多繼承
子類繼承多個(gè)父類
案例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()

多繼承可以繼承多個(gè)父類,也繼承了所有父類的屬性和方法
注意:如果多個(gè)父類中有同名的 屬性和方法,則默認(rèn)使用第一個(gè)父類的屬性和方法(根據(jù)類的魔法屬性mro的順序來查找)
多個(gè)父類中,不重名的屬性和方法,不會(huì)有任何影響。
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('動(dòng)物就是玩')
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('公募機(jī)構(gòu)買入和賣出')
class Simu(Gupiao):
def lianghua(self):
Gupiao.__init__(self)
Gupiao.xinqing(self)
print('私募機(jī)構(gòu)買入和賣出')
def xinqing(self):
print('專研自己的輸出股票和私募買入和賣出')
g=Gongmu()
g.lianghua()
print('*'*10)
s=Simu()
s.lianghua()
s.xinqing()

到此這篇關(guān)于Python中關(guān)于面向?qū)ο笾欣^承的詳細(xì)講解的文章就介紹到這了,更多相關(guān)Python 面向?qū)ο?繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3實(shí)現(xiàn)打印任意寬度的菱形代碼
這篇文章主要介紹了Python3實(shí)現(xiàn)打印任意寬度的菱形代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
解決Django中修改js css文件但瀏覽器無法及時(shí)與之改變的問題
今天小編就為大家分享一篇解決Django中修改js css文件但瀏覽器無法及時(shí)與之改變的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python在不同目錄下導(dǎo)入模塊的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狿ython在不同目錄下導(dǎo)入模塊的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
python針對(duì)Oracle常見查詢操作實(shí)例分析
這篇文章主要介紹了python針對(duì)Oracle常見查詢操作,結(jié)合實(shí)例形式分析了python針對(duì)Oracle常見的子查詢、多表查詢等相關(guān)原理、操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-04-04
聊聊python中令人迷惑的duplicated和drop_duplicates()用法
這篇文章主要介紹了聊聊python中令人迷惑的duplicated和drop_duplicates()用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python解析網(wǎng)頁源代碼中的115網(wǎng)盤鏈接實(shí)例
這篇文章主要介紹了Python解析網(wǎng)頁源代碼中的115網(wǎng)盤鏈接實(shí)例,主要采用了正則表達(dá)式re模塊來實(shí)現(xiàn)該功能,需要的朋友可以參考下2014-09-09
Jupyter Notebook 實(shí)現(xiàn)正常顯示中文和負(fù)號(hào)
這篇文章主要介紹了Jupyter Notebook 實(shí)現(xiàn)正常顯示中文和負(fù)號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04

