在Python语言中,给定实例从中继承特定方法的类

2024-09-28 22:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在Python中,给定一个类ClassA,使用

inspect.getmembers(ClassA, predicate=inspect.ismethod)

我可以遍历ClassA中的不同方法。继承的方法也被收集起来,这在我的例子中很方便。但是我需要的是,给定一个method1的方法ClassA,来获取ClassA从中继承method1的类。它可能是ClassA本身,或者它的任何父母/祖父母。我想我可以递归遍历__bases__属性,在每一步寻找method1属性。但也许这个功能已经在某处实现了。还有别的办法吗?你知道吗


Tags: 方法功能属性例子bases办法inspect父母
1条回答
网友
1楼 · 发布于 2024-09-28 22:21:25

使用^{}(既适用于旧样式类,也适用于新样式类)查看MRO(方法解析顺序):

def class_for_method(cls, method):
    return next((c for c in inspect.getmro(cls) 
                 if method.__func__ in vars(c).values()), None)

目前没有stdlib方法为您执行此搜索,没有

演示:

>>> import inspect
>>> def class_for_method(cls, method):
...     return next((c for c in inspect.getmro(cls) 
...                  if method.__func__ in vars(c).values()), None)
... 
>>> class Base1(object):
...     def foo(self): pass
... 
>>> class Base2(object):
...     pass
... 
>>> class ClassA(Base1, Base2):
...     pass
... 
>>> class_for_method(ClassA, ClassA.foo)
<class '__main__.Base1'>

如果找不到基类,则上述表达式返回None

>>> class Bar:
...     def spam(): pass
... 
>>> class_for_method(ClassA, Bar.spam) is None
True

相关问题 更多 >