2010-04-10 94 views
129

如何獲得Python類的父類?獲取班級家長?

+31

@FranckDernoncourt此線程現在是「python get parent class」的最高谷歌搜索結果。它比構成接下來的3個結果的其他SO問題略有關聯。第五個結果是一個沒有給出答案的Python文檔頁面,第六個結果最終是一個Python文檔頁面,它給出了答案,儘管深入一長頁文本。 – 2012-05-17 18:26:33

+22

爲什麼有人會在對SO的解釋更有說服力且易於訪問時閱讀文檔?從我發現這個問題開始,直到我從Google到達這個頁面時,我用了不到5秒的時間,而搜索文檔至少需要我五次,可能幾分鐘。 – jononomo 2012-12-31 02:04:46

+6

作爲一個想快速找到答案的人,搜索谷歌,找到了這個鏈接,並完成了我需要完成的工作:爲什麼人們(我認爲斯洛特的評論已被刪除)抱怨有人提出了一個有效的問題?是的,我知道我在這裏的晚會非常晚。 – limasxgoesto0 2013-10-25 18:11:18

回答

149

使用以下屬性:

cls.__bases__ 

docs

類 對象的基類的元組。

例子:

>>> str.__bases__ 
(<type 'basestring'>,) 

又如:

>>> class A(object): 
... pass 
... 
>>> class B(object): 
... pass 
... 
>>> class C(A, B): 
... pass 
... 
>>> C.__bases__ 
(<class '__main__.A'>, <class '__main__.B'>) 
74

如果你想把所有的祖先而不僅僅是眼前的,使用inspect.getmro

import inspect 
print inspect.getmro(cls) 

有用地,這給你所有的祖先類在「方法解析順序」 - 即祖先在解析方法時將被檢查的順序(或者實際上,任何其他屬性 - 方法和其他屬性居於相同的畢竟,Python中的命名空間;-)。

+7

你也可以直接使用'cls .__ mro__'(至少在Python 3.5中) – naught101 2017-01-16 22:27:32

3

如果你想確保他們都被調用,請在各個級別使用super

+0

一旦你使用super,你必須在所有級別使用它,這就是爲什麼你應該明確地使用它。你也許想知道,超級不適用於每個班級...... – DasIch 2010-04-10 03:57:36

11

新樣式類有一個你可以調用的mro方法,它以方法解析順序返回一個父類的列表。

+0

什麼是新式課程?看起來我可以在Django模型中使用它,但是從'object'繼承的任何東西似乎都不會響應'mro'。 – 2015-06-15 14:21:11

+0

考慮對象'x',我們可以得到與呼叫 '型的方法解析順序(X).mro()' 我們可以考慮,如果'x'有'ClassX'與基類: 'ClassX in type(x).mro()' – 648trindade 2017-01-15 01:11:10