多繼承
所謂多繼承巧鸭,即子類有多個(gè)父類旦委,并且具有它們的特征
代碼為先定義一個(gè)父類
classA:
defprintA(self):
print('----A----')
再定義一個(gè)父類(-.-!)
classB:
defprintB(self):
print('----B----')
定義子類
lassC(A,B):
defprintC(self):
print('----C----')
這里面的子類就可以繼承兩個(gè)父類草讶,并且自己可以添加自己的函數(shù)方法
如果子類調(diào)用父類方法,而父類被調(diào)用的方法重復(fù)了,那么就會(huì)調(diào)用第一個(gè)父類的方法
在子類中父類方法里面的方法也可以調(diào)用莹痢,是一級(jí)一級(jí)向上找的,比方父類方法a里面有個(gè)其他類的方法b,子類c如果想調(diào)用c竞膳,就可以直接在父類里面實(shí)現(xiàn)
子類重寫覆蓋父類
所謂重寫航瞭,就是子類中,有一個(gè)和父類相同名字的方法坦辟,在子類中的方法會(huì)覆蓋掉父類中同名的方法
子類中如果有父類方法刊侯,就會(huì)直接覆蓋父類的方法
如果就只想調(diào)用父類的方法,可以在子類蟲谷方法的后添加super().__init__(name)格式
多態(tài)
Python(鴨子語言)
“當(dāng)看到一只鳥走起來像鴨子锉走、游泳起來像鴨子滨彻、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子挠日〈粒”表明python是弱類型語言,不需要定義類型
所謂多態(tài):定義時(shí)的類型和運(yùn)行時(shí)的類型不一樣嚣潜,此時(shí)就成為多態(tài)
·Python “鴨子類型”
‘’’
python是一種弱類型語言冬骚,沒有類型限制。
變量的類型永遠(yuǎn)是通過右側(cè)的值判斷的懂算。
方法中的參數(shù)只冻,傳遞任何值都行。但是要考慮方法內(nèi)部的業(yè)務(wù)邏輯计技。
多態(tài):
1喜德、父類作為參數(shù),可以傳遞父類和子類對(duì)象
2垮媒、接口作為參數(shù)舍悯,只能傳遞實(shí)現(xiàn)對(duì)象
所以有兩種理解:
1、python不支持多態(tài):
python是弱類型睡雇,沒有類型限定萌衬,無法區(qū)分父和子,或者說接口和實(shí)現(xiàn)類
2它抱、python處處是多態(tài)
python是弱類型秕豫,沒有類型限定,傳遞任何內(nèi)容都行
類屬性和實(shí)例屬性
類屬性
就是公有的方法里面的屬性观蓄,沒有被self定義
實(shí)例屬性
就是被定義值的屬性混移,在對(duì)象里面被定義self特定值
class People(object):
country = 'china' #類屬性
print(People.country)
p = People()
print(p.country)
p.country = 'japan'
print(p.country) ?????#實(shí)例屬性會(huì)屏蔽掉同名的類屬性
print(People.country)
del p.country ???#刪除實(shí)例屬性
print(p.country)
在調(diào)用類方法時(shí)候,對(duì)象會(huì)自己創(chuàng)建一個(gè)環(huán)境把類方法的地址復(fù)制進(jìn)去侮穿,當(dāng)你做修改的時(shí)候歌径,修改的只是對(duì)象里面的函數(shù),不影響類方法
靜態(tài)方法和類方法
類方法@classmethod方法里面盡量寫(cls)
可以通過實(shí)例對(duì)象和類對(duì)象都可以訪問方法
class People(object):
country = 'china'
@classmethod
def getCountry(cls):
print(type(cls))
print(cls)
return cls.country
p = People()
p.country=1
print(p.getCountry())
print People.getCountry()
在例子中亲茅,不管調(diào)用的是類方法還是實(shí)例方法都打印的是china
他們的指向都是一樣的沮脖,都指向__main__.People
類方法可以用來修改類屬性
class People(object):
country = 'china'
@classmethod
def getCountry(cls):
return cls.country
@classmethod
def setCountry(cls,country):
cls.country = country
p = People()
print(p.getCountry())
print(People.getCountry())
p.setCountry('japan')
print(p.getCountry())
print(People.getCountry())
Setmethod中的cls是用來修改getCountry中的cls值金矛,而此cls值等同于類屬性people里面的country = 'china',所以把country進(jìn)行了修改
從類方法和實(shí)例方法以及靜態(tài)方法的定義形式就可以看出來勺届,類方法的第一個(gè)參數(shù)是類對(duì)象cls,那么通過cls引用的必定是類對(duì)象的屬性和方法娶耍;而實(shí)例方法的第一個(gè)參數(shù)是實(shí)例對(duì)象self免姿,那么通過self引用的可能是類屬性、也有可能是實(shí)例屬性(這個(gè)需要具體分析)榕酒,不過在存在相同名稱的類屬性和實(shí)例屬性的情況下胚膊,實(shí)例屬性優(yōu)先級(jí)更高。
靜態(tài)方法
需要通過修飾器@staticmethod來進(jìn)行修飾想鹰,靜態(tài)方法不需要多定義參數(shù)
class People(object):
country = 'china'
__num = 100
@classmethod
def getCountry(cls):
return cls.country
@staticmethod
def myStaticMethod():
print('myStaticMethod...')
print(People.__num)
p = People()
p.country=1
print(p.getCountry())
print(People.getCountry())
print(p.myStaticMethod())
print(People.myStaticMethod())
此方法中p.country=1是在p中添加了一個(gè)屬性紊婉,不改變類屬性,而用靜態(tài)方法調(diào)用對(duì)象時(shí)