167

给定一个类Foo(无论它是否是新式类),你如何生成所有基类——继承层次结构中的任何地方——它issubclass的?

4

7 回答 7

224

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'>)
于 2009-09-09T20:28:21.327 回答
49

查看python 上可用的__bases__属性class,其中包含基类的元组:

>>> 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>]
于 2009-09-09T19:48:12.130 回答
42

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

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
于 2009-09-09T19:47:54.370 回答
21

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

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

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

于 2009-09-09T19:47:49.160 回答
16

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

于 2019-07-10T07:49:24.937 回答
15

在 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 中,每个类都继承自基对象类。

于 2019-06-22T06:26:19.270 回答
2

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

前任:

class MyClass(YourClass):

一个继承类

  • 儿童班
  • 派生类
  • 子类

前任:

class YourClass(Object):

继承的类

  • 家长班
  • 基类
  • 超类

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

实例 -> 类 -> 然后继承的类

使用

import inspect
inspect.getmro(MyClass)

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

于 2018-02-02T15:38:06.133 回答