簡體   English   中英

在Python中,給定實例從其繼承特定方法的類

[英]In Python, class from which a given instance is inheriting a particular method

我知道,在Python中,給出一類ClassA ,與

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

我可以遍歷ClassA存在的不同方法。 還收集了繼承的方法,在我的情況下很方便。 但是我需要的是,給定ClassA的特定方法method1 ,以獲取ClassA繼承了method1的類。 它可能是ClassA本身,或其任何父母/祖父母。 我以為我可以遞歸地遍歷__bases__屬性,在每一步都尋找method1屬性。 但是也許此功能已經在某處實現。 還有另一種方法嗎?

使用inspect.getmro() (適用於新舊類)瀏覽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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM