如何获得Python类的父母?


Answers:


232

使用以下属性:

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'>)

1
要获取实例化对象的基础,请type(C()).__bases__按照下面的进一步说明进行操作
citynorman

105

如果要所有祖先而不是直接祖先,请使用inspect.getmro

import inspect
print inspect.getmro(cls)

有用的是,这为您提供了“方法解析顺序”中的所有祖先类-即在解析方法(或实际上是任何其他属性时,将检查祖先的顺序)-方法和其他属性都位于同一个命名空间中毕竟是在Python中;-)。


33
您也可以使用cls.__mro__(至少在Python 3.5中使用)
naught101 '01

@ naught101,请把它变成一个完整的答案。我几乎想念它,我想很多人也会想念它。
Shihab Shahriar Khan

14

新型类具有可调用的mro方法,该方法按方法解析顺序返回父类列表。


什么算是新型课程?看来我可以在Django模型中使用此功能,但是从继承的任何内容object似乎都没有响应mro
Brian Kung

1
考虑的对象x,就可以得到了与调用方法解析顺序 type(x).mro() ,我们可以考虑是否xClassX与基类: ClassX in type(x).mro()
648trindade

13

最快的方式查看所有父母,然后按顺序使用内置__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仅会不必要地覆盖范围。老实说,人们不知道仅使用内置功能是一种耻辱

我希望这有帮助!


@John Smith stackoverflow.com/users/139885/john-smith,希望您能看到此答案。如果您喜欢,请通过投票告诉我!
PyTis

1
实际上,inspect.getmro只是调用__mro__对象,如github.com/python/cpython/blob/…所示。使用 getmro会产生更清晰,更易读的代码。尽管跳过函数调用确实更快。
tna0y

9

如果您只想获取父母,请使用基数,使用__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)

3

如果要确保它们都被调用,请super在所有级别上使用。


一旦使用了super,就无论如何都必须在所有级别使用它,这就是为什么您应该明确记录它的使用的原因。另外,您可能想知道super并非在所有课程上都适用...
DasIch 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.