如何获得Python类的父级?

Joh*_*ith 183 python oop

如何获取Python类的父类?

Aym*_*ieh 208

使用以下属性:

cls.__bases__
Run Code Online (Sandbox Code Playgroud)

来自文档:

类对象的基类的元组.

例:

>>> str.__bases__
(<type 'basestring'>,)
Run Code Online (Sandbox Code Playgroud)

另一个例子:

>>> class A(object):
...   pass
... 
>>> class B(object):
...   pass
... 
>>> class C(A, B):
...   pass
... 
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
Run Code Online (Sandbox Code Playgroud)

  • 要获取实例化对象的基础,请执行“type(C()).__bases__”,如下所述 (6认同)

Ale*_*lli 98

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

import inspect
print inspect.getmro(cls)
Run Code Online (Sandbox Code Playgroud)

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

  • 你也可以使用`cls .__ mro__`(至少在Python 3.5中) (24认同)
  • `cls.mro()` 也有效 (3认同)

Das*_*Ich 14

新样式类有一个可以调用的mro方法,它以方法解析顺序返回父类列表.


Pas*_*ten 12

如果您只想获取父项,请使用基数,使用__mro__(如@naught101 所指出的)获取方法解析顺序(以便了解 init 的执行顺序)。

基础(并首先获取现有对象的类):

>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
Run Code Online (Sandbox Code Playgroud)

对于最近 Python 版本中的 mro:

>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
Run Code Online (Sandbox Code Playgroud)

显然,当您已经有了类定义时,您可以直接调用__mro__它:

>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
Run Code Online (Sandbox Code Playgroud)


PyT*_*Tis 7

最快的方式查看所有父母,然后按顺序使用内置__mro__

repr(YOUR_CLASS.__mro__)


>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
Run Code Online (Sandbox Code Playgroud)

输出,IN ORDER


(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>, 
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
Run Code Online (Sandbox Code Playgroud)

你有它。目前“最佳”的答案是182票(我在输入时),但是这比一些复杂的for循环要简单得多,一次查看一个类,更不用说当一个类扩展两个或两个以上父级时类。导入和使用inspect仅会不必要地覆盖范围。老实说,人们不知道仅使用内置功能是一种耻辱

我希望这有帮助!

  • 事实上, `inspect.getmro` 只是在对象上调用 `__mro__` ,正如您在 https://github.com/python/cpython/blob/ded4737989316653469763230036b04513cb62b3/Lib/inspect.py#L486 中看到的那样。使用“getmro”可以生成更清晰、更易读的代码。尽管跳过函数调用确实更快。 (2认同)