python中的繼承

2022-07-31 15:48:19 字數 2654 閱讀 8555

一.繼承,多繼承

子類繼承父類:為父類進行擴充套件

mro(method resolution order) 方法解析順序

python 2

1.使用經典類(寫繼承關係的時候,基類不繼承object)

2.新式類(繼承關係的根,是object)

python 3

只有新式類

二.經典類的mro

經典類的mro使用的是深度優先遍歷

從左到右,一直走到頭,每個走一次

三.新式類的mro c3

1.新式類中摒棄了(部分)的深度優先演算法,使用c3演算法

2.如果你的繼承關係中沒有菱形繼承,深度優先來計算mro

有菱形繼承,使用c3演算法來計算mro

3.c3演算法

先拆分再合併

拆分 : 例如拆分h :  l(h) = h + l(g) + l(f) + gf

合併 : 例如合併c:   l(c) = c + l(a) + a     = ca

class a:

pass

class b(a):

pass

class c(a):

pass

class d(b, c):

pass

class e(c, a):

pass

class f(d, e):

pass

class m:

pass

class n(m):

pass

class p(e, a):

pass

class x:

pass

class q(p, n, x):

pass

class g(q, f):

pass

class h(g, f):

pass

''' 求h的mro

設求mro的演算法是l

l(h) = h + l(g) + l(f) + gf

l(g) = g + l(e) + e

l(e) = e + l(c) + l(a) + ca

l(c) = c + l(a) + a

l(a) = a

l(f) = f + l(d) + l(e) + de

l(d) = d + l(b) + l(c) + bc

l(b) = b + l(a) + a

# 加法:merge(), 拿第一項的第一位和 後面每項的除了第一位比較. 如果沒有出現, 則該位元素算出

如果出現了. 此時開始下一項的第一位繼續和後面每一項的除了第一位比較:

用頭和後面身體比較

l(h) = h + l(g) + l(f) + gf # eca + dbeca = hgfdbecao

l(g) = g + l(e) + e # geca

l(e) = e + l(c) + l(a) + ca # eca

l(c) = c + l(a) + a # ca

l(a) = a

l(f) = f + l(d) + l(e) + de # fdbeca

l(d) = d + l(b) + l(c) + bc # dbca

l(b) = b + a + a # ba

'''print(h.__mro__)

四.super()

super()可以訪問mro中的下乙個類中的內容.找父類

super(類名,self) 從某個類開始找下乙個mro

先算mro順序,再看清楚self是誰,在什麼是進行計算

class init(object):

def __init__(self, v): # 2

print("init")

self.val = v

class add2(init):

def __init__(self, val): # 2

print("add2")

super(add2, self).__init__(val) # mult

print(self.val)

self.val += 2

class mult(init):

def __init__(self, val):

print("mult")

super(mult, self).__init__(val) # haha

self.val *= 5

class haha(init):

def __init__(self, val):

print("哈哈")

super(haha, self).__init__(val) # init

self.val /= 5

class pro(add2,mult,haha): #

pass

class incr(pro): # incr->pro->add2->mult->haha->init

def __init__(self, val): # 5

super(incr, self).__init__(val) # add2

self.val += 1

p = incr(5)

print(p.val)

c = add2(2)

print(c.val)

Python中的繼承

ass cat object def init self,name 動物 color 白色 self.name name self.color color def test self print self.name print self.color def run self print s 在跑步 ...

Python中的多繼承

python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。class p1 object deffoo self print p1 foo class p2 object deffoo...

python 中類的繼承

python 中的類可以繼承父類這是眾所周知的。突然發現遇到乙個問題,如果父類和子類都含有某個方法,是採用什麼掉用方式呢,我想的是會呼叫之類方法,如果不存在,則呼叫父類方法。python 應該滿足該就近原則。還是動手驗證下記得清楚,儲存檔案為test.py class parent object d...