列出给定类层次结构中的所有基类?

给定一个类 Foo(无论它是否是 新风格类) ,如何生成基类 所有-在继承层次结构中的任何位置-它的 issubclass

94178 次浏览

可以使用 class 对象的 __bases__元组:

class A(object, B, C):
def __init__(self):
pass
print A.__bases__

__bases__返回的元组具有它的所有基类。

inspect.getclasstree()将创建一个嵌套的类及其基的列表。 用法:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.

请参阅 python class上提供的 __bases__财产,它包含一组基类:

>>> def classlookup(cls):
...     c = list(cls.__bases__)
...     for base in c:
...         c.extend(classlookup(base))
...     return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]

inspect.getmro(cls) 既适用于新样式类,也适用于旧样式类,并且返回与 NewClass.mro()相同的内容: 类及其所有祖先类的列表,按照用于方法解析的顺序排列。

>>> class A(object):
>>>     pass
>>>
>>> class B(A):
>>>     pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

虽然 Jochen 的答案非常有帮助且正确,因为您可以使用。Getmro ()方法,同样需要强调的是 Python 的继承层次结构如下:

class MyClass(YourClass):

继承类

  • 儿童班
  • 派生类
  • 子类

class YourClass(Object):

继承的类

  • 家长课
  • 基础课
  • 超级阶级

一个类可以从另一个类继承 - 类的属性是继承的 特别是,它的方法是继承的 - 这意味着继承(子)类的实例可以访问继承(父)类的属性

Instance-> class-> then 继承类

使用

import inspect
inspect.getmro(MyClass)

将显示 Python 中的层次结构。

在 python 3.7中,不需要导入 check,type.mro 会给出结果。

>>> class A:
...   pass
...
>>> class B(A):
...   pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>

注意,在 python 3.x 中,每个类都从基对象类继承。

根据 巨蟒博士,我们也可以简单地使用 class.__mro__属性或 class.mro()方法:

>>> class A:
...     pass
...
>>> class B(A):
...     pass
...
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True