python通過(guò)子類(lèi)繼承超類(lèi)來(lái)定制子類(lèi)的行為。
1.1 重寫(xiě)類(lèi)方法
(1)如果子類(lèi)和超類(lèi)有同名方法,根據(jù)搜索樹(shù)規(guī)則,優(yōu)先調(diào)用子類(lèi)方法。
(2)子類(lèi)重寫(xiě)超類(lèi)方法:在子類(lèi)定義和父類(lèi)已有的同名的方法。
(3)一般是對(duì)父類(lèi)方法的加強(qiáng),即存在父類(lèi)方法的處理邏輯。
1.2 父類(lèi)名.方法名
用法
class SupClass:
def methodA(self):pass
class SubClass(SupClass):
def methodA(self):
SupClass.methodA(self)
pass
描述
在子類(lèi),通過(guò)“父類(lèi)名.方法名”調(diào)用父類(lèi)同名方法,達(dá)到簡(jiǎn)化代碼的效果。
SupClass.methodA(self):
(1)通過(guò)“類(lèi)名.方法名”調(diào)用方法時(shí),需要送一個(gè)實(shí)例給方法。
(2)self為當(dāng)前調(diào)用方法的實(shí)例,故需顯式將self送給父類(lèi)方法。
1.3 多態(tài)
python子類(lèi)如果重寫(xiě)超類(lèi)的方法,那么根據(jù)搜索樹(shù)規(guī)則:
超類(lèi)實(shí)例對(duì)象,會(huì)調(diào)用超類(lèi)的同名方法;
子類(lèi)實(shí)例對(duì)象,會(huì)調(diào)用子類(lèi)的同名方法;
即,會(huì)根據(jù)當(dāng)前調(diào)用實(shí)例,自動(dòng)調(diào)用對(duì)應(yīng)的方法。
條件:
(1) 繼承:多態(tài)發(fā)生在子類(lèi)和超類(lèi)之間
(2) 重寫(xiě):子類(lèi)重寫(xiě)父類(lèi)方法。
1.4 示例
class Tool:
def payraise(self,p,*args):
p.payraise(*args)
class MyPerson:
def __init__(self,name,job = None,pay = 0):
self.name = name
self.job = job
self.pay = pay
def payraise(self,rate):
self.pay = int(self.pay * (1 + rate))
def __str__(self):
return 'MyPerson:name={0.name},job={0.job},pay={0.pay}'.format(self)
class MyManager(MyPerson):# 繼承
# 重寫(xiě)
def payraise(self,rate,bonus=0.1):
MyPerson.payraise(self,rate+bonus)
if __name__ == '__main__':
mp1 = MyPerson('mp1')
mp2 = MyPerson('mp2','c++開(kāi)發(fā)',20000)
mm1 = MyManager('mm1','開(kāi)發(fā)經(jīng)理',50000)
print(mp1)
print(mp2)
print(mm1)
mp2.payraise(0.1)
mm1.payraise(0.1)
print(mp2)
print(mm1)
print('#'*10+'多態(tài)'+'#'*10)
for p in (mp1,mp2,mm1):
p.payraise(0.1)
print(p)
t = Tool()
print('#'*10+'多態(tài)'+'#'*10)
for p in (mp1,mp2,mm1):
t.payraise(p,0.1)
print(p)
# 打開(kāi)cmd,執(zhí)行下面示例
E:\\documents\\F盤(pán)>python myperson.py
MyPerson:name=mp1,job=None,pay=0
MyPerson:name=mp2,job=c++開(kāi)發(fā),pay=20000
MyPerson:name=mm1,job=開(kāi)發(fā)經(jīng)理,pay=50000
MyPerson:name=mp2,job=c++開(kāi)發(fā),pay=22000
MyPerson:name=mm1,job=開(kāi)發(fā)經(jīng)理,pay=60000
##########多態(tài)##########
MyPerson:name=mp1,job=None,pay=0
MyPerson:name=mp2,job=c++開(kāi)發(fā),pay=24200
MyPerson:name=mm1,job=開(kāi)發(fā)經(jīng)理,pay=72000
##########多態(tài)##########
MyPerson:name=mp1,job=None,pay=0
MyPerson:name=mp2,job=c++開(kāi)發(fā),pay=26620
MyPerson:name=mm1,job=開(kāi)發(fā)經(jīng)理,pay=86400
-
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1956瀏覽量
36551 -
python
+關(guān)注
關(guān)注
56文章
4827瀏覽量
86625
發(fā)布評(píng)論請(qǐng)先 登錄
請(qǐng)教:子類(lèi)數(shù)據(jù)流使用父類(lèi)后數(shù)據(jù)類(lèi)型就變成父類(lèi)了而不是子類(lèi)
建立父類(lèi)即其子類(lèi)的同名方法——關(guān)于重寫(xiě)VI的問(wèn)題
3分鐘看懂Python面向?qū)ο?/a>
如何使用Python的類(lèi)? 優(yōu)勢(shì)有哪些?
python類(lèi)的繼承
python類(lèi)的多態(tài)和類(lèi)的property屬性
詳解IO設(shè)備管理之父類(lèi)調(diào)用子類(lèi)方法的過(guò)程
探討一下JAVA子類(lèi)調(diào)用父類(lèi)構(gòu)造器函數(shù)
更好地理解SystemVerilog的多態(tài)Polymorphism
python類(lèi)的繼承詳解
python類(lèi)的多態(tài)和類(lèi)的property屬性
淺析JVM虛方法表和方法調(diào)用

子類(lèi)中繼承父類(lèi)的方法

super調(diào)用父類(lèi)的構(gòu)造方法

評(píng)論