給定一個類Foo
(不管它是否爲new-style類),如何生成全部基類 - 繼承層次結構中的任何位置 - 它是否爲issubclass
?列出給定類的層次結構中的所有基類?
回答
inspect.getmro(cls)
既適用於新老樣式類,並返回相同NewClass.mro()
:該類及其所有祖先類的列表,按照用於方法解析的順序。
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
幹得好:http://docs.python.org/library/inspect.html#inspect.getmro – 2009-09-09 20:44:22
不工作對於pyobjc類:( 文件「/Users/rbp/Projects/zzzzzzz/macmdtypes.py」,第70行,強制 print inspect.getmro(path) 文件「/System/Library/Frameworks/Python.framework/版本/ 2.7/lib/python2.7/inspect.py「,第348行,在getmro _searchbase(cls,result) 文件」/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 /inspect.py」,線路339,在_searchbases 用於CLS基.__ bases__: AttributeError的: '__NSTaggedDate' 對象沒有屬性 '__bases__來得到' – rbp 2013-08-08 17:11:45
@rbp我SUS PECT,你有,我遇到了同樣的問題:你試圖做'inspect.getmro(OBJ)',而不是'inspect.getmro(類型(OBJ))'。 – esmit 2015-07-09 18:40:48
可以使用__bases__
元組對象的類:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
通過__bases__
返回的元組具有其所有的基類。
希望它有幫助!
inspect.getclasstree()
將創建一個類和它們的基礎的嵌套列表。 用法:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
哦,很好。而爲了更好的輸出,請使用pprint! 'python -c'導入檢查;來自pprint import pprint as pp; PP(inspect.getclasstree(inspect.getmro(IO錯誤)))'' – penguin359 2016-11-15 04:58:55
見__bases__
property可在一個python class
,其中包含了基礎類的元組:
>>> def classlookup(cls):
... c = list(cls.__bases__)
... for base in c:
... c.extend(classlookup(base))
... return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]
這可能引入重複。這就是爲什麼'getmro'的文檔明確說「沒有類在這個元組中多次出現」? – 2009-09-09 20:45:25
注意,'__bases__'只到達**一個級別**。 (當你的遞歸效用暗示,但在例如粗略地看一眼可能不會對回暖。) – 2016-03-18 14:31:11
儘管約亨的答案是非常有益的,正確的,因爲你可以用獲得的類層次結構。該檢查模塊的getmro()方法,它也必須強調的是Python的繼承層次如下:
例如:
class MyClass(YourClass):
繼承類
- 兒童類
- 派生類
- 子類
例如:
class YourClass(Object):
繼承的類
- 父類
- 基類
- 超類
一類可以從另一個 繼承 - 類歸因繼承 - 特別是,它的方法是遺傳 - 這意味着一個繼承(子)類的實例都可以訪問歸因繼承(父)類的
實例 - >類 - >然後繼承類
使用
import inspect
inspect.getmro(MyClass)
會顯示您的層次結構,內Python的。
- 1. 獲取類層次結構中類型的基類
- 2. 類層次結構
- 3. NSObject的類層次結構
- 4. WordPress的 - 列出層次結構中的所有頁面
- 5. 父類和子類的層次結構
- 6. Scala中的值類的層次結構?
- 7. 類層次結構設計 - 接口+基類與抽象類
- 8. Agda中的類型層次結構
- 9. MySQL中的類層次結構
- 10. Common Lisp類層次結構
- 11. Automapper和類層次結構
- 12. LESS CSS類層次結構
- 13. CSS - 類層次結構?
- 14. 如何聚合類層次結構的所有屬性?
- 15. 您有以下類層次結構
- 16. WordPress的 - 列出每個類別下的職位類別的層次結構
- 17. 具體類名與類層次結構
- 18. 如何列出python文件中給定類型的所有類?
- 19. JAXB類層次結構的註釋
- 20. 簡化複雜的類層次結構
- 21. 類別層次結構的實現
- 22. 在Java中獲取類層次結構?
- 23. 在Python中擴展類層次結構
- 24. 如何列出存儲在MySQL中的層次結構中的所有直接和間接子類型
- 25. 查找從python中的給定基類派生的所有類
- 26. 如何使用每個類層次結構策略的表來管理nhibernate中的多級類層次結構?
- 27. 我是否需要替換Java中層次結構中的所有類文件?
- 28. 列出給定類的所有內部類 - Python
- 29. 在CakePHP中定義模型類的層次結構
- 30. Python:類層次結構中的自定義deepcopy
給定一個類對象('type'將會是更好的術語)'isinstance'將不起作用...或者你的意思是'issubclass'或者你想要一個實例;-p – 2009-09-09 20:21:45
謝謝;我編輯了這篇文章。 – 2009-09-09 20:39:33