问题:列出给定类的层次结构中的所有基类?
Given a class Foo
(whether it is a new-style class or not), how do you generate all the base classes – anywhere in the inheritance hierarchy – it issubclass
of?
回答 0
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'>)
inspect.getmro(cls)
works for both new and old style classes and returns the same as NewClass.mro()
: a list of the class and all its ancestor classes, in the order used for method resolution.
>>> class A(object):
>>> pass
>>>
>>> class B(A):
>>> pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)
回答 1
请参阅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>]
See the __bases__
property available on a python class
, which contains a tuple of the bases classes:
>>> 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
inspect.getclasstree()
将创建一个嵌套的类及其基列表。用法:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
inspect.getclasstree()
will create a nested list of classes and their bases.
Usage:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
回答 3
您可以使用__bases__
类对象的元组:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
返回的元组__bases__
具有其所有基类。
希望能帮助到你!
you can use the __bases__
tuple of the class object:
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
The tuple returned by __bases__
has all its base classes.
Hope it helps!
回答 4
在python 3.7中,您无需导入inspect,type.mro将为您提供结果。
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
注意,在python 3.x中,每个类都继承自基础对象类。
In python 3.7 you don’t need to import inspect, type.mro will give you the result.
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
attention that in python 3.x every class inherits from base object class.
回答 5
根据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
According to the Python doc, we can also simply use class.__mro__
attribute or class.mro()
method:
>>> 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
回答 6
尽管Jochen的回答非常有帮助和正确,但是您可以使用inspect模块的.getmro()方法获得类层次结构,但是突出显示Python的继承层次结构也很重要:
例如:
class MyClass(YourClass):
继承类
例如:
class YourClass(Object):
继承的类
一个类可以从另一个类继承-该类的属性是继承的-特别是其方法是继承的-这意味着继承(子)类的实例可以访问该继承(父)类的属性
实例->类->然后继承的类
使用
import inspect
inspect.getmro(MyClass)
将在Python中向您显示层次结构。
Although Jochen’s answer is very helpful and correct, as you can obtain the class hierarchy using the .getmro() method of the inspect module, it’s also important to highlight that Python’s inheritance hierarchy is as follows:
ex:
class MyClass(YourClass):
An inheriting class
- Child class
- Derived class
- Subclass
ex:
class YourClass(Object):
An inherited class
- Parent class
- Base class
- Superclass
One class can inherit from another
– The class’ attributed are inherited
– in particular, its methods are inherited
– this means that instances of an inheriting (child) class can access attributed of the inherited (parent) class
instance -> class -> then inherited classes
using
import inspect
inspect.getmro(MyClass)
will show you the hierarchy, within Python.