在 Python 中获取父类的名称
Get name of Parent class in Python
要获取父类的名称:
- 使用
__bases__
类上的属性获取父类的元组。 - 使用
for
循环遍历元组。 - 使用
__name__
每个类的属性来获取父类的名称。
主程序
class Person(): pass class Employee(Person): pass class Developer(Employee): pass immediate_parents = Developer.__bases__ print(immediate_parents) # 👉️ (<class '__main__.Employee'>,) for parent in immediate_parents: print(parent.__name__) # 👉️ Employee print(immediate_parents[0].__name__) # 👉️ Employee
我们用了
类。_ _ bases _ _
属性获取类的父类的元组。
如果您只能访问该类的一个实例,请访问使用该实例调用该类的结果的属性。
__bases__
type()
主程序
class Person(): pass class Employee(Person): pass class Developer(Employee): pass d1 = Developer() immediate_parents = type(d1).__bases__ print(immediate_parents) # 👉️ (<class '__main__.Employee'>,) for parent in immediate_parents: print(parent.__name__) # 👉️ Employee print(immediate_parents[0].__name__) # 👉️ Employee
类型类返回对象的类型。
最常见的返回值与访问对象的属性相同。
__class__
您可以使用相同的方法在类内部获取类的父类的名称。
主程序
class Person(): pass class Employee(Person): pass class Developer(Employee): def get_parent_class_names(self): immediate_parents = self.__class__.__bases__ print(immediate_parents) for parent in immediate_parents: print(parent.__name__) d1 = Developer() # (<class '__main__.Employee'>,) # Employee d1.get_parent_class_names()
该__bases__
属性只返回给定类的直接父类。
如果需要获取类的所有祖先的名称,请使用
inspect.getmro()
方法。
主程序
import inspect class Person(): pass class Employee(Person): pass class Developer(Employee): pass base_classes = inspect.getmro(Developer) # 👇️ (<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>) print(base_classes) for base in base_classes: # Developer # Employee # Person # object print(base.__name__)
MRO 是方法解析顺序的缩写。
我们使用了
inspect.getmro
方法来获取给定类的基类的元组。
提供的类是元组中的第一个元素,没有类出现超过一次。
如果您只能访问该类的一个实例,请
type()
在调用该getmro()
方法时将该实例传递给该类。
主程序
import inspect class Person(): pass class Employee(Person): pass class Developer(Employee): pass d1 = Developer() base_classes = inspect.getmro(type(d1)) # 👇️ (<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>) print(base_classes) for base in base_classes: # Developer # Employee # Person # object print(base.__name__)
类也有一个__mro__
属性。
主程序
class Person(): pass class Employee(Person): pass class Developer(Employee): pass base_classes = Developer.__mro__ # 👇️ (<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>) print(base_classes) for base in base_classes: # Developer # Employee # Person # object print(base.__name__)
类
。_ _ mro _ _
属性返回在方法解析期间查找基类时考虑的类的元组。
类有一个mro()
在类实例化时调用的方法。该mro()
方法的输出存储在__mro__
属性中。
主程序
class Person(): pass class Employee(Person): pass class Developer(Employee): pass base_classes = Developer.mro() # 👇️ [<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>] print(base_classes) for base in base_classes: # Developer # Employee # Person # object print(base.__name__)
class.mro方法可以被元类
覆盖以自定义类实例的方法解析顺序,但这不是您经常必须做的事情。