如何获取Python类的父类?
答案 0 :(得分:194)
使用以下属性:
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'>)
答案 1 :(得分:92)
如果您想要所有祖先而不仅仅是直接的祖先,请使用inspect.getmro:
import inspect
print inspect.getmro(cls)
有用的,它为您提供了“方法解析顺序”中的所有祖先类 - 即在解析方法时(或者,实际上,任何其他属性 - 方法和其他属性存在时)检查祖先的顺序毕竟,Python中的命名空间相同; - )。
答案 2 :(得分:13)
新式类有一个可以调用的mro方法,它以方法解析顺序返回父类列表。
答案 3 :(得分:4)
最快 的方式来查看所有父母,并且按顺序,只需使用内置的 __mro__
即 repr(YOUR_CLASS.__mro__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
输出, IN ORDER
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
那里有。目前“最佳”答案具有182票(我在输入时),但这比一些复杂的for loop要简单得多,一次查看基础一类,更不用说何时一个类扩展两个或更多父类。导入和使用inspect
只会不必要地使作用域模糊。老实说,人们不知道仅使用内置功能是一种耻辱
我希望这会有所帮助!
答案 4 :(得分:3)
如果你想确保他们都被召唤,请在所有级别使用super
。
答案 5 :(得分:1)
如果只想获取父母,请使用基数,请使用__mro__
(如@ naught101所指出的)来获取方法解析顺序(以便知道初始化的执行顺序)。
基础(首先获取现有对象的类):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
对于最新Python版本中的mro:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
很显然,当您已经有了一个类定义时,您可以直接在其上调用__mro__
:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)