一.繼承,多繼承
子類繼承父類:為父類進行擴充套件
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...