如何获取Python类的父类?

如何获取Python类的父类?

151127 次浏览

使用以下属性:

cls.__bases__

文档:

类的基类元组 对象。< / p >

例子:

>>> 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中存在于同一个命名空间中;-)。

如果你想确保它们都被调用,在所有级别使用super

New-style类有一个mro方法,你可以调用它,它会按照方法解析的顺序返回父类的列表。

如果你只是想获取父类,则使用__mro__(正如@naught101所指出的)来获取方法解析顺序(以便知道init的执行顺序)。

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

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

获得所有父类的最快方法是使用内置的__mro__

例如,repr(YOUR_CLASS.__mro__)

以下几点:

import getpass
getpass.GetPassWarning.__mro__

...输出,依次为:

(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>, <type 'exceptions.Warning'>, <type 'exceptions.Exception'>, <type 'exceptions.BaseException'>, <type 'object'>)

你知道了。“best"答案可能有更多的投票,但这比一些复杂的for循环要简单得多,每次只查看一个__bases__类,更不用说当一个类扩展了两个或更多的父类。导入并使用inspect只会不必要地模糊作用域。

这个函数将打印一个对象的所有类,而在每一步中,下一个对象将是最左边的父类。

def print_root_left(class_):
while True:
print(class_)
# Check there if are no bases then we have reached the root class
if not class_.__bases__:
break
class_=class_.__bases__[0] # use the left most parent




example = "hello"
print_root_left(example.__class__)

我已经回答过一次了,但是你也可以使用“pip3 install pytis"然后使用/看一下,“getip”;程序,用Python编写。

你可以在这里找到它的代码:https://github.com/PyTis/PyTis/blob/development/src/pytis/getip.py

我是链接库的作者。

如果你有一个变量,想要得到它的父类,使用类型()方法,它将为一个变量提供类

val="happy coding"
print(type(val).__mro__)

输出:

(<class 'str'>, <class 'object'>)