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

时间:2009-09-09 19:41:52

标签: python class inheritance oop introspection

给定一个类Foo(无论它是否为new-style类),如何在继承层次结构中的任何位置生成所有基类 - 它{ {3}}?

7 个答案:

答案 0 :(得分:166)

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

答案 1 :(得分:37)

请参阅python class上提供的__bases__ property,其中包含基类的元组:

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

答案 2 :(得分:29)

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

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

答案 3 :(得分:20)

您可以使用类对象的__bases__元组:

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

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

希望它有所帮助!

答案 4 :(得分:2)

虽然Jochen的答案非常有用且正确,但是您可以使用inspect模块的.getmro()方法获取类层次结构,同样重要的是要强调Python的继承层次结构如下:

例如:

class MyClass(YourClass):

继承类

  • 儿童班
  • 派生类
  • 子类

例如:

class YourClass(Object):

继承的课程

  • 家长班
  • 基础课程
  • 超类

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

的属性

实例 - &gt; class - &gt;然后继承类

使用

import inspect
inspect.getmro(MyClass)

将在Python中向您展示层次结构。

答案 5 :(得分:0)

  

在python 3.7中,您无需导入检查,请输入type.mro即可得到结果。

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

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

答案 6 :(得分:0)

根据Python doc,我们还可以简单地使用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