python物件導向程式設計(二)類的繼承

2021-09-25 23:00:42 字數 4153 閱讀 8161

繼承性最根本的作用就是避免編寫重複**,在建立乙個類的時候,形參中定義乙個類名,表示該類是從哪個類繼承而來的,如果沒有合適的繼承類,用object,因為所有的類最終都會繼承object這個類。

class person (object):

pass

p = person()

類怎麼繼承呢,在es6中類的繼承是通過extend,在類的constructor方法中還要定義乙個關鍵字super,它指向父類,執行super()才能實現真正的繼承;在python中,子類繼承父類需要在子類形參中定義父類的名字:

# 父類 animal

class animal (object):

def run(self,param):

print('%s is running' % param)

# 子類dog

class dog (animal):

pass

# 子類cat

class cat (animal):

pass

dog = dog()

cat = cat()

dog.run('dog') # dog is running

cat.run('cat') # cat is running

上邊**,分別定義了父類animal,子類dog和cat,兩個子類繼承了父類animal的所有屬性和方法,所以通過例項都能夠訪問父類的例項方法。

1、子類和父類同時定義了相同的方法,子類方法會覆蓋父類方法;

2、當定義乙個類的時候,實際上定義的是一種資料型別。定義的資料型別與python自帶的資料型別如:列表list、元組tuple、字串str、集合set、dict字典一樣!

3、可以使用isinstance()來判斷乙個元素是否是某個型別:

# 判斷li是否是乙個列表

li =

judge_type = isinstance(li,list)

print(judge_type) # true

# 判斷子類dog是否是dog

class animal (object):

pass

class dog (animal):

pass

dog = dog()

judge_type1 = isinstance(dog,dog)

judge_type2 = isinstance(dog,animal)

print(judge_type1) # true

print(judge_type2) # true

上邊**,dog的資料型別即是dog也是animal,因為dog是dog建立的乙個例項物件,而dog子類是繼承自animal父類的,這樣就不難理解為什麼上邊我們用isinstance判斷輸出都是true。

如果父類在別的資料夾下,我們可以通過引入模組的形式實現子類繼承父類:

# 假設father檔案 是在 m 資料夾下

class father(object):

def __init__(self,name,age):

self.name = name

self.age = age

#son檔案,子類son需要繼承 father父類

# from m import father

class son (father):

def fn (self):

print(self.name) # '呆呆君'

print(self.age) # 100

s = son ('呆呆君',100)

s.fn()

上邊**,借用父類__init__建構函式,在子類中輸出父類中定義的例項變數;子類還可以定義自己的例項變數。。。

有兩種方法:(常用的是第二種方法,下邊兩種方法,呼叫父類方法時,python都不會為例項方法的第乙個引數self繫結例項物件,所以需要手動顯示的繫結第乙個引數self   !!!)

1、直接用過父類.方法呼叫

2、通過super( 子類,self ) .父類的方法 () 或python3中的簡寫:super( ).父類方法( )

# 下邊的父類是在  py_package資料夾  下的  m1檔案  中

class father():

def fn (self,name,age):

print(name)

print(age)

# 子類引入父類

from py_package.m1 import father

class son (father):

def __init__(self,name,age):

# 方法一

father.fn(self,name,age) # '呆呆君' 100

# 方法二

super(son, self).fn(name,age) # '呆呆君' 100

s = son ('呆呆君',100)

上邊**,在子類son建構函式中引入父類father的fn方法,經常用到的是方法二使用super( )呼叫父類方法

使用super()也可以去呼叫父類建構函式,與呼叫普通方法一樣。

當子類方法與父類方法重名,會執行子類的方法,父類方法不會輸出:

# 父類

class father():

def fn(self):

print('父類')

# 子類

from py_package.m1 import father

class son (father):

def fn(self):

print('子類')

s = son ()

s.fn() # '子類'

上邊**,子類繼承了父類,都有fn方法,但是最後輸出的是子類中的方法的結果,也叫作重寫父類方法。如果想輸出父類fn的的結果,需要使用super()

from py_package.m1 import father

# f = father

class son (father):

def fn(self):

super(son, self).fn()

print('子類')

s = son ()

s.fn()

# 父類

# 子類

上邊**,我們在子類例項方法fn中使用super呼叫了父類例項方法fn,結果輸出了父類方法的結果。。。

關於super函式是否是呼叫了父級的方法或屬性問題,先來看下簡單的小例子:

類b和c 繼承 a,而類d 繼承 b和c,來看下列印順序:

d 和b的順序沒問題,但是當執行類b時,按道理應該去呼叫類a的__init__方法,然而它呼叫了類c的方法了,原因:super( )方法呼叫的順序規則必須符合mro演算法:

當d繼承b和c時,它會先執行d,然後接著執行b,然後c,最後才執行a:

我們也可以列印python內建函式 __mro__也能看到其執行順序:

Python物件導向 二)類的建立與訪問

python不允許例項化物件訪問類的私有資料,但是可以利用object.classname attr來訪問屬性,例如 class myclass var 10 c myclass c.var traceback most recent call last file line 1,in c.var a...

物件導向(二)類的自動載入

spl autoload register callable autoload function bool throw true bool prepend false bool spl autoload register 函式可以註冊任意數量的自動載入器,當使用尚未被定義的類 class 和介面 i...

C 物件導向實驗二 類與物件

類的建立和使用類來建立物件。類的資料成員的宣告。成員函式的宣告和定義。private,public訪問限定符的使用。使用提供的公有的成員函式給物件成員賦值。類 包含私有的資料成員 length,wide 和公有的成員函式 過載的建構函式oneclass,求和函式add,輸出顯示函式 display ...