2014-03-06 53 views
0

我知道在Python,給定的一類ClassA,與在Python,類從該給定實例在繼承一個特定方法

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

我可以遍歷存在於ClassA的不同方法。還收集了繼承的方法,這對我來說很方便。但是,我需要的是,給定ClassA的特定方法method1,以獲得繼承ClassA的類method1。它可能是ClassA本身,或者它的任何父母/祖父母。我以爲我可以遞歸遍歷__bases__屬性,在每個步驟中查找method1屬性。但也許這個功能已經在某個地方實現了。有另一種方法嗎?

回答

4

去翻MRO(方法解析順序),使用inspect.getmro()(這兩個新老樣式類作品):

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 
+0

我測試,它正是我需要的。不知道「getmro」。謝謝! – zeycus

+0

@zeycus:我已經完善了一點,以便在重寫方法的情況下更強大;它只會找到一個方法來自的* exact *基類,即使您傳入的方法現在已經被更高版本的基類覆蓋。 –

+0

再次感謝,我將使用改進版本。這些微妙之處超出了我當前的OOP Python知識。 – zeycus

相關問題