在 Python 中获取一个类的所有基类
Get all base classes of a class in Python
使用该inspect.getmro()
方法获取给定类的所有基类,例如print(inspect.getmro(Developer))
. 该getmro()
方法返回一个包含所提供类的基类的元组。
main.py
import inspect class Person(): pass class Employee(Person): pass class Developer(Employee): pass # 👇️ (<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>) print(inspect.getmro(Developer)) d1 = Developer() # 👇️ (<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>) print(inspect.getmro(type(d1))) # 👇️ (<class '__main__.Employee'>,) print(Developer.__bases__)
我们使用了
inspect.getmro
方法来获取给定类的基类的元组。
MRO 是方法解析顺序的缩写。
提供的类是元组中的第一个元素,没有类出现超过一次。
如果您只能访问该类的一个实例,请
type()
在调用该getmro()
方法时将该实例传递给该类。
main.py
import inspect class Person(): pass class Employee(Person): pass class Developer(Employee): pass d1 = Developer() # 👇️ (<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>) print(inspect.getmro(type(d1)))
类型类返回对象的类型。
最常见的返回值与访问__class__
对象的属性相同。
类也有一个__mro__
属性。
main.py
class Person(): pass class Employee(Person): pass class Developer(Employee): pass # 👇️ (<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>) print(Developer.__mro__)
类
。_ _ mro _ _
属性返回在方法解析期间查找基类时考虑的类的元组。
类有一个mro()
在类实例化时调用的方法。该mro()
方法的输出存储在__mro__
属性中。
main.py
class Person(): pass class Employee(Person): pass class Developer(Employee): pass # 👇️ [<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>] print(Developer.mro())
class.mro方法可以被元类
覆盖以自定义类实例的方法解析顺序,但这不是您经常必须做的事情。
如果您只需要获取给定类的直接基类,请使用该
class.__bases__
属性。
main.py
class Person(): pass class Employee(Person): pass class Developer(Employee): pass # 👇️ (<class '__main__.Employee'>,) print(Developer.__bases__)
类
。_ _ bases _ _
属性返回给定类的直接基类的元组。