類的繼承, 多繼承, 屬性查詢, 類的型別與抽象

2021-10-13 16:08:31 字數 4548 閱讀 1040

?不使用繼承時編寫多個類

class

animal

:def

run(self)

:print

("奔跑"

)def

eat(self)

:print

("吃東西"

)class

duck

:def

run(self)

:print

("奔跑"

)def

eat(self)

:print

("吃東西"

)def

speak

(self)

:print

("嘎嘎嘎"

)class

pig:

defrun

(self)

:print

("奔跑"

)def

eat(self)

:print

("吃東西"

)def

speak

(self)

:print

("咕咕咕"

)class

person

:def

run(self)

:print

("奔跑"

)def

eat(self)

:print

("吃東西"

)def

speak

(self)

:print

("呵呵呵"

)

?使用繼承編寫多個類

class

animal

:def

run(self)

:print

("奔跑"

)def

eat(self)

:print

("吃東西"

)class

duck

(animal)

:def

speak

(self)

:print

("嘎嘎嘎"

)class

pig(animal)

:def

speak

(self)

:print

("咕咕咕"

)class

person

(animal)

:def

speak

(self)

:print

("呵呵呵"

)

?#可以明顯感覺到**量減少

class

animal

:def

run(self)

:print

("跑起來"

)class

work

:def

doing

(self)

:print

("敲**"

)class

person

(animal,work)

:# 可以繼承很多個類,用","隔開

defeat

(self)

:print

("吃東西"

)

print

(person.__bases__)

# (, ) 兩個

class

shawn

:def

am(self)

:print

("i am from shawn"

)class

pai:

defam

(self)

:print

("i am from pai"

)classda:

defam

(self)

:print

("i am from da"

)class

xing

(pai,shawn,da)

:# 繼承了三個父類,查詢順序:從左到右

pass

start = xing(

)start.am(

)# i am from pai (找到的是最左邊的)

ps: ctrl + 滑鼠右鍵 快速跳轉到屬性 / 方法位置, 有時並不準確

class

bar1

(object):

deffoo1

(self)

:print

("i am bar1_foo1"

)def

foo2

(self)

:print

("i am bar1_foo2"

) self.foo1(

)###

class

bar2

(bar1)

:def

foo1

(self)

:print

("i am bar2_foo1"

)obj = bar2(

)obj.foo2(

)'''輸出

i am bar1_foo2 (物件自己沒有到父類去找)

i am bar2_foo1 (執行到"self.foo1()"後又返回來從最開始找)

'''

?在"python3"中

class

default

:# 預設繼承"object"

pass

print

(default.__bases__)

# (,)

?在"python2"中

class

default

(object):

# 新式類

pass

class

animal

:# 經典類

pass

?"python2"中"print"語法

print default.__bases__ # (,)

print animal.__bases__ # ()

ps: 新式類與經典類的屬性查詢順序是不一樣的

"蟹堡王餐廳"

def__init__

(self,name,age,***)

: self.name = name

self.age = age

self.*** = ***

class

staff

(people)

:def

sell

(self)

:print

(f"正在賣蟹堡"

)class

boss

(people)

:def

payoff

(self,obj,money)

:print

(f"給發了元工資"

) obj.money = money

s1 = staff(

"海綿寶寶",20

,"male"

)b1 = boss(

"蟹老闆",18

,"male"

)s1.sell(

)# 海綿寶寶正在賣蟹堡

b1.payoff(s1,

300)

# 蟹老闆給海綿寶寶發了300元工資

print

(s1.money)

# 300

[類名]

.__name__ # 類的名字(字串)

[類名]

.__doc__ # 類的文件字串

[類名]

.__base__ # 類的第乙個父類(在講繼承時會講)

[類名]

.__bases__ # 類所有父類構成的元組(在講繼承時會講)

[類名]

.__dict__ # 類的字典屬性

[類名]

.__module__ # 類定義所在的模組

[類名]

.__class__ # 例項對應的類(僅新式類中)

類的派生

面說到python支援多繼承, 但新式類與經典類的屬性查詢順序是不一樣的

菱形繼承問題

類的繼承 多繼承

多繼承要注意很多地方,以下 只是最基本多繼承方式,下面會講到多繼承的基本格式和繼承方法 簡單說明 1 如果在子類中需要父類的構造方法就需要顯示的呼叫父類的構造方法,或者不重寫父類的構造方法。2 在呼叫基類的方法時,需要加上基類的類名字首,且需要帶上 self 引數變數。區別在於類中呼叫普通函式時並不...

python類例項屬性,例項方法, 繼承, 多繼承

coding utf 8 import requests class spider name 豬八戒 def init self,url 類初始化方法,例項化類最先呼叫,可直接通過類名呼叫 self.target url target 即為例項化屬性 例項化後的屬性可以被例項化物件訪問,也可以被例項...

介面類的多繼承

動物園 老虎 tiger 走路 游泳 天鵝 swan 走路 游泳 飛 老鷹 oldying 飛 走路 from abc import abstractmethod,abcmeta 介面的多繼承 介面類 class swim animal metaclass abcmeta 游泳 abstractme...