在 Python 中获取父类的名称

在 Python 中获取父类的名称

Get name of Parent class in Python

要获取父类的名称:

  1. 使用__bases__类上的属性获取父类的元组。
  2. 使用for循环遍历元组。
  3. 使用__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方法可以被元
覆盖以自定义类实例的方法解析顺序,但这不是您经常必须做的事情。

发表评论