获取在 Python 中定义给定方法的类
Get the class that defined a given method in Python
要获取定义给定方法的类:
- 使用该
inspect.getmro()
方法获取类的基类的元组。 - 使用
for
循环遍历集合。 - 检查该方法是否包含在任何类中。
主程序
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))