十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
繼承指的是類與類之間的關(guān)系,是一種什么“是”什么的關(guān)系,繼承的功能之一就是用來解決代碼重用問題。
繼承是一種創(chuàng)建新類的方式,在Python中,新建的類可以繼承一個(gè)或多個(gè)父類,父類可以成為基類或超類,新建的類成為派生類或子類成都網(wǎng)絡(luò)公司-成都網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司十載經(jīng)驗(yàn)成就非凡,專業(yè)從事做網(wǎng)站、網(wǎng)站設(shè)計(jì),成都網(wǎng)頁設(shè)計(jì),成都網(wǎng)頁制作,軟文平臺(tái),一元廣告等。十載來已成功提供全面的成都網(wǎng)站建設(shè)方案,打造行業(yè)特色的成都網(wǎng)站建設(shè)案例,建站熱線:18980820575,我們期待您的來電!
class ParentClass1: #定義父類
pass
class ParentClass2: #定義父類
pass
class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass
pass
class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號(hào)分隔開多個(gè)繼承的類
pass
"__base__只查看從左到右繼承的第一個(gè)父類
__bases__查看所有繼承的父類"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class ParentClass1: #定義父類
pass
class ParentClass2: #定義父類
pass
class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass
pass
class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號(hào)分隔開多個(gè)繼承的類
pass
print(SubClass1.__base__)
print(SubClass2.__base__)
print(SubClass1.__bases__)
print(SubClass2.__bases__)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
(,)
(, )
Process finished with exit code 0
1.只有在Python2中才有新式類和經(jīng)典類,Python3中全部都是新式類
2.在Python2中,如果沒有顯式的繼承object類,那該類和其子類都是經(jīng)典類
3.在Python2中,如果顯式的繼承object類,那該類和其子類都是新式類
4.在Python3中,無論是否繼承object,都默認(rèn)繼承object,即Python3中所有類都是新式類
5.在Python3中,如果沒有指定基類,會(huì)默認(rèn)繼承object類,object是所有Python類的基類
print(ParentClass1.__bases__)
print(ParentClass2.__bases__)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
(,)
(,)
Process finished with exit code 0
抽象:抽取類似的部分,主要用于劃分類別
繼承:基于抽象的結(jié)果,通過編程語言去實(shí)現(xiàn)它,所以需要先對(duì)事物或邏輯進(jìn)行抽象,之后通過繼承的方式表達(dá)出抽象的結(jié)構(gòu)
在開發(fā)中,如果類A與類B有很多相同的代碼,就可以通過繼承來實(shí)現(xiàn),提高代碼的重用性
可以讓B繼承A,B會(huì)‘遺傳’A的所有屬性(包含數(shù)據(jù)屬性和函數(shù)屬性)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Hero:
def __init__(self,nickname,aggressivity,life_value):
self.nickname=nickname
self.aggressivity=aggressivity
self.life_value=life_value
def attack(self,enemy):
enemy.life_value-=self.aggressivity
class Garen(Hero):
pass
class Riven(Hero):
pass
g1=Garen('草叢倫',100,300)
r1=Riven('銳雯雯',57,200)
print(g1.life_value) #結(jié)果:300
r1.attack(g1)
print(g1.life_value) #結(jié)果:243
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
300
243
Process finished with exit code 0
"用已經(jīng)有的類新建一個(gè)新的類,這樣就可以重用已經(jīng)有的軟件中的部分代碼,大大節(jié)省編程工作量,這就是軟件重用,不僅可以重用自己的類,還可以繼承別人寫的類,也可繼承標(biāo)準(zhǔn)庫。"
不管是類中的數(shù)據(jù)屬性還是函數(shù)屬性,都是先在自己的類中查找,沒有,再到父類中查找
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Foo:
def f1(self):
print('Foo.f1')
def f2(self):
print('Foo.f2')
self.f1()
class Bar(Foo):
def f1(self):
print('Bar.f1')
b=Bar()
#f2()在Bar類中沒有,就去父類Foo中找,父類中的f2又調(diào)用self.f1,同樣先去自己的類中找,找到了,就返回。
b.f2()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Foo.f2
Bar.f1
Process finished with exit code 0
子類也可以添加自己的新屬性或重新定義父類中含有的數(shù)據(jù)屬性和函數(shù)屬性,子類中新定義的屬性對(duì)父類中的屬性是沒有影響的,但一旦重新定義的自己的屬性與父類中的屬性重名,調(diào)用新的屬性就以自己的為準(zhǔn)了
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Hero:
def __init__(self,nickname,aggressivity,life_value):
self.nickname=nickname
self.aggressivity=aggressivity
self.life_value=life_value
def attack(self,enemy):
enemy.life_value-=self.aggressivity
class Garen(Hero):
pass
class Riven(Hero):
camp='Noxus'
def attack(self,enemy): #在自己這里定義新的attack,不再使用父類的attack,且不會(huì)影響父類
print('from riven')
def fly(self): #在自己這里定義新的
print('%s is flying' %self.nickname)
g1=Garen('草叢倫',100,300)
r1=Riven('銳雯雯',57,200)
r1.attack(g1)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
from riven
Process finished with exit code 0
在子類中,新建了與父類中重名的函數(shù)屬性,在編輯函數(shù)內(nèi)功能的時(shí)候,有可能需要重用父類中的同名的那個(gè)函數(shù),此時(shí)調(diào)用父類中同名函數(shù)的方法:類名.func(),此時(shí)就與調(diào)用普通函數(shù)相同了,因此self也要為其傳值
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Hero:
def __init__(self,nickname,aggressivity,life_value):
self.nickname=nickname
self.aggressivity=aggressivity
self.life_value=life_value
def attack(self,enemy):
enemy.life_value-=self.aggressivity
class Garen(Hero):
pass
class Riven(Hero):
camp='Noxus'
def __init__(self,nickname,aggressivity,life_value,skin):
Hero.__init__(self,nickname,aggressivity,life_value) #調(diào)用父類功能
self.skin=skin #新屬性
def attack(self,enemy): #在自己這里定義新的attack,不再使用父類的attack,且不會(huì)影響父類
Hero.attack(self,enemy) #調(diào)用功能
print('from riven')
def fly(self): #在自己這里定義新的
print('%s is flying' %self.nickname)
r1=Riven('銳雯雯',57,200,'比基尼')
r1.fly()
print(r1.skin)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
銳雯雯 is flying
比基尼
Process finished with exit code 0
上面我們一直在說,對(duì)于數(shù)據(jù)屬性和函數(shù)屬性的查找,
首先找對(duì)象自身的定義空間,即對(duì)象.__dict__的結(jié)果,
如果沒有,去自己的類中找,
自己類中沒有,再去父類中找。
但是當(dāng)繼承比較復(fù)雜,有多個(gè)父類,父類還有父類,這種情況下是怎樣的一個(gè)查找順序呢?
python有一個(gè)方法解析順序表(MRO),這個(gè)MRO列表就是一個(gè)屬性的查找順序列表,找到了相關(guān)的屬性就停止查找,否則就一直按照這個(gè)順序找到最后,找不到,就報(bào)錯(cuò)了
>>> F.mro() #等同于F.__mro__
[, , ,
, , , ]
MRO列表遵循三條準(zhǔn)則:
1.子類優(yōu)先于父類被檢查
2.多個(gè)父類會(huì)根據(jù)他們?cè)诹斜碇械捻樞蛉z查
3.如果下一個(gè)類中存在兩個(gè)合法的選擇,選擇第一個(gè)父類
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C(A):
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有這個(gè)屬性可以查看線性列表,經(jīng)典類沒有這個(gè)屬性
#新式類繼承順序:F->D->B->E->C->A
#經(jīng)典類繼承順序:F->D->B->A->E->C
#python3中統(tǒng)一都是新式類
#pyhon2中才分新式類與經(jīng)典類
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
from D
(, , , , , , )
Process finished with exit code 0
"當(dāng)C不繼承A了,新式類與經(jīng)典類的順序就相同了"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C:
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D,E):
# def test(self):
# print('from F')
pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有這個(gè)屬性可以查看線性列表,經(jīng)典類沒有這個(gè)屬性
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
from D
(, , , , , , )
Process finished with exit code 0
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Vehicle: # 定義交通工具類
Country = 'China'
def __init__(self, name, speed, load, power):
self.name = name
self.speed = speed
self.load = load
self.power = power
def run(self):
print('開動(dòng)啦...')
class Subway(Vehicle): # 地鐵
def __init__(self, name, speed, load, power, line):
Vehicle.__init__(self, name, speed, load, power)# 指名道姓方式,調(diào)用父類中同名的方法
self.line = line
def run(self):
print('地鐵%s號(hào)線歡迎您' % self.line)
Vehicle.run(self)# 指名道姓方式,調(diào)用父類中同名的方法
line13 = Subway('中國地鐵', '180m/s', '1000人/箱', '電', 13)
line13.run()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
地鐵13號(hào)線歡迎您
開動(dòng)啦...
Process finished with exit code 0
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Vehicle: # 定義交通工具類
Country = 'China'
def __init__(self, name, speed, load, power):
self.name = name
self.speed = speed
self.load = load
self.power = power
def run(self):
print('開動(dòng)啦...')
class Subway(Vehicle): # 地鐵
def __init__(self, name, speed, load, power, line):
# super(Subway,self) # Python2的寫法 在python3中super()等同于super(Subway,self)
super().__init__(name, speed, load, power)
self.line = line
def run(self):
print('地鐵%s號(hào)線歡迎您' % self.line)
#super(Subway, self).run()# Python2的寫法
super().run() #Python3中,可以不在super()中寫類名和self
class Mobike(Vehicle): # 摩拜單車
pass
line13 = Subway('中國地鐵', '180m/s', '1000人/箱', '電', 13)
line13.run()
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
地鐵13號(hào)線歡迎您
開動(dòng)啦...
Process finished with exit code 0
"方式一與屬性查找的mro順序沒有關(guān)系,直接指定了調(diào)用哪個(gè)類中的方法
方式二是會(huì)按照mro列表中的順序,向后查找相應(yīng)的屬性"
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
# "A沒有繼承B,但是A內(nèi)super會(huì)基于C.mro()繼續(xù)往后找"
class A:
def test(self):
super().test()
class B:
def test(self):
print('from B')
class C(A,B):
pass
c=C()
c.test() #打印結(jié)果:from B
print(C.mro())
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
from B
[, , , ]
Process finished with exit code 0
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。