Answers:
使用以下属性:
cls.__bases__
从文档:
类对象的基类的元组。
例:
>>> 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'>)
如果要所有祖先而不是直接祖先,请使用inspect.getmro:
import inspect
print inspect.getmro(cls)
有用的是,这为您提供了“方法解析顺序”中的所有祖先类-即在解析方法(或实际上是任何其他属性时,将检查祖先的顺序)-方法和其他属性都位于同一个命名空间中毕竟是在Python中;-)。
cls.__mro__
(至少在Python 3.5中使用)
新型类具有可调用的mro方法,该方法按方法解析顺序返回父类列表。
object
似乎都没有响应mro
。
x
,就可以得到了与调用方法解析顺序 type(x).mro()
,我们可以考虑是否x
有ClassX
与基类: ClassX in type(x).mro()
以最快的方式查看所有父母,然后按顺序使用内置__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循环要简单得多,一次查看一个基类,更不用说当一个类扩展两个或两个以上父级时类。导入和使用inspect
仅会不必要地覆盖范围。老实说,人们不知道仅使用内置功能是一种耻辱
我希望这有帮助!
inspect.getmro
只是调用__mro__
对象,如github.com/python/cpython/blob/…所示。使用 getmro
会产生更清晰,更易读的代码。尽管跳过函数调用确实更快。
如果您只想获取父母,请使用基数,使用__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)
如果要确保它们都被调用,请super
在所有级别上使用。
type(C()).__bases__
按照下面的进一步说明进行操作