如何获得Python类的父级?

时间:2010-04-10 01:32:21

标签: python oop

如何获取Python类的父类?

6 个答案:

答案 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)