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