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...