获取在 Python 中定义给定方法的类

获取在 Python 中定义给定方法的类

Get the class that defined a given method in Python

要获取定义给定方法的类:

  1. 使用该inspect.getmro()方法获取类的基类的元组。
  2. 使用for循环遍历集合。
  3. 检查该方法是否包含在任何类中。
主程序
import inspect class Person(): def greet(self): print('hello world') class Employee(Person): pass class Developer(Employee): pass d1 = Developer() print(d1.greet.__qualname__) # 👉️ Person.greet def get_class_that_defined_method(method): for cls in inspect.getmro(method.__self__.__class__): if method.__name__ in cls.__dict__: return cls return None # 👇️ <class '__main__.Person'> print(get_class_that_defined_method(d1.greet))

_ _ qualname _ _属性返回类、函数、方法、描述符或生成器实例的

限定名称。

如果需要获取定义属性的类的名称,则可以使用该属性。

主程序
import inspect class Person(): def greet(self): print('hello world') class Employee(Person): pass class Developer(Employee): pass d1 = Developer() print(d1.greet.__qualname__) # 👉️ Person.greet name = d1.greet.__qualname__.split('.')[0] print(name) # 👉️ Person

如果您需要访问类对象,请使用该inspect.getmro()方法迭代该类的基类。

主程序
import inspect class Person(): def greet(self): print('hello world') class Employee(Person): pass class Developer(Employee): pass d1 = Developer() def get_class_that_defined_method(method): for cls in inspect.getmro(method.__self__.__class__): if method.__name__ in cls.__dict__: return cls return None # 👇️ <class '__main__.Person'> print(get_class_that_defined_method(d1.greet))

inspect.getmro
方法返回

定类的基类的元组。

MRO 是方法解析顺序的缩写。

提供的类是元组中的第一个元素,没有类出现超过一次。
主程序
import inspect class Person(): def greet(self): print('hello world') class Employee(Person): pass class Developer(Employee): pass d1 = Developer() # 👇️ '(<class '__main__.Developer'>, <class '__main__.Employee'>, <class '__main__.Person'>, <class 'object'>) print(inspect.getmro(d1.__class__))

我们使用for循环来遍历基类。

在每次迭代中,我们检查方法的名称是否存在于类对象的字典中。

_
_ name _ _属性
返回类、函数、方法、描述符或生成器实例的名称。

__dict__属性返回一个包含对象的属性和值的字典。

主程序
import inspect class Person(): def greet(self): print('hello world') class Employee(Person): pass class Developer(Employee): pass d1 = Developer() print(d1.greet.__name__) # 👉️ greet # 👇️ {'greet': <function Person.greet at 0x7fad6d8d5ab0>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, '__module__': '__main__'} print(Person.__dict__)

请注意,该类的字典Person包含一个greet键。

这是返回定义给定方法的类的完整代码片段。

主程序
import inspect class Person(): def greet(self): print('hello world') class Employee(Person): pass class Developer(Employee): pass d1 = Developer() def get_class_that_defined_method(method): for cls in inspect.getmro(method.__self__.__class__): if method.__name__ in cls.__dict__: return cls return None # 👇️ <class '__main__.Person'> print(get_class_that_defined_method(d1.greet))