Python新式類MRO演算法 C3演算法

2021-09-10 16:44:41 字數 1683 閱讀 5164

mro

method resolution order,即方法解析順序,是用來處理python中的二義性問題的演算法。

二義性python因為支援多繼承,而多繼承的程式語言往往存在二義性問題。

二義性問題

魔鬼三角繼承:有兩個基類a和b,a和b中都定義了方法f(),c類繼承了a類和b類,那麼呼叫c類的f()時出現不確定情況。

恐怖菱形繼承:有乙個基類a,定義了方法f(),b類和c類繼承了a類(的f()方法),d類繼承了b和c類,那麼出現乙個問題,d不知道應該繼承b的f()方法還是c的f()方法。

經典類一種沒有繼承的類,所有的型別都是type型別,如果經典類作為父類,子類呼叫父類建構函式會報錯。一種沒有繼承的類,所有的型別都是type型別,如果經典類作為父類,子類呼叫父類建構函式會報錯。

新式類每乙個類都繼承自乙個基類,預設繼承自object,子類可以呼叫基類的建構函式,所有類都有乙個公共的祖先類object。每乙個類都繼承自乙個基類,預設繼承自object,子類可以呼叫基類的建構函式,所有類都有乙個公共的祖先類object。

單繼承示例**

class a():

def __init__(self):

self.name = "a.name"

def fun(self):

print("a:fun")

class b(a):

def __init__(self):

self.name = "b.name"

a.__init__(self)

super(b,self).__init__()

def fun(self):

print("b:fun")

a.fun(self)

super(b,self).fun()

print("b:fun")

多繼承示例**

class a(object):

def __init__(self):

print('進入a')

print('離開a')

class b(object):

def __init__(self):

print('進入b')

print('離開b')

class c(a):

def __init__(self):

print('進入c')

super(c,self).__init__()

print('離開c')

class d(a):

def __init__(self):

print('進入d')

super(d,self).__init__()

print('離開d')

class e(b,c):

def __init__(self):

print('進入e')

b.__init__(self)

c.__init__(self)

print('離開e')

class f(e,d):

def __init__(self):

print('進入f')

e.__init__(self)

d.__init__(self)

print('離開f')

f = f()

print(f.__mro__)

Python 的MRO演算法

mro method resolution order 方法解析順序 作用 在python中用於處理二義性問題的演算法 python支援多繼承,多繼承的語言往往會遇到兩類二義性的問題 1 有兩個基類a b,a和b都定義了方法f c繼承a和b,呢麼呼叫c的f 方法是會出現不確定 2 有乙個基類a,定義...

python 新式類和舊式類

python的新式類是2.2版本引進來的,我們可以將之前的類叫做經典類或者舊類。為什麼要在2.2中引進new style class呢?官方給的解釋是 為了統一類 class 和型別 type 在2.2之前,比如2.1版本中,類和型別是不同的,如a是classa的乙個例項,那麼a.class 返回 ...

python 新式類和舊式類

新式類和舊式類 python的新式類是2.2版本引進來的,我們可以將之前的類叫做經典類或者舊類。為什麼要在2.2中引進new style class呢?官方給的解釋是 為了統一類 class 和型別 type 在2.2之前,比如2.1版本中,類和型別是不同的,如a是classa的乙個例項,那麼a.c...