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

Rei*_*ica 123 python oop inheritance class introspection

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

Joc*_*zel 179

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'>)
Run Code Online (Sandbox Code Playgroud)

  • @rbp我怀疑你遇到了同样的问题:你试图做`inspect.getmro(obj)`而不是`inspect.getmro(type(obj))`. (16认同)
  • 对于pyobjc类无效:(文件“ /Users/rbp/Projects/zzzzzzz/macmdtypes.py”,第70行,强制打印inspect.getmro(path)文件“ /System/Library/Frameworks/Python.framework/版本/2.7/lib/python2.7/inspect.py”,第348行,位于getmro _searchbases(cls,result)文件“ /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect”中.py“,第339行,位于_searchbases中,用于cls .__ bases__中的base:AttributeError:'__NSTaggedDate'对象没有属性'__bases__' (2认同)

Cre*_*esh 41

查看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>]
Run Code Online (Sandbox Code Playgroud)

  • 小心,`__bases__`只上升**一级**.(正如你的递归效用所暗示的那样,但粗略地看一眼这个例子可能不会对此有所了解.) (8认同)
  • 这可能会引入重复.这就是为什么`getmro`的文档明确地说"在这个元组中没有类出现过多次"? (5认同)

Ned*_*der 32

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

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
Run Code Online (Sandbox Code Playgroud)

  • 哦,不错。为了获得更好的输出,请使用 pprint!`python -c'导入检查;从 pprint 导入 pprint 作为 pp;pp(inspect.getclasstree(inspect.getmro(IOError)))'` (2认同)

man*_*del 20

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

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你!

  • 如果您的类继承自另一个类,而该类又继承自另一个类,则只有链的第一部分位于其“__bases__”中 (4认同)
  • @Temperosa,它可能简单干净,但这是错误的 (4认同)

YaO*_*OzI 14

根据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

Run Code Online (Sandbox Code Playgroud)


Ser*_*jik 12

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

>>> class A:
...   pass
... 
>>> class B(A):
...   pass
... 
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
Run Code Online (Sandbox Code Playgroud)

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