2013-12-19 39 views
1

什麼是知道一個班級的成員是否是一種方法的最pythonic方法?注意:我只有(posssible)方法的名稱(可以是類方法實例方法靜態方法)。如何知道一個班級的成員是否是一種方法?

目前我與<type 'function'>比較在類的字典中的對象的類型:

def isMethodOf(methodName,klass): 
    return type(klass.__dict__.get(methodName)) == type(lambda x:x) 

我真的不知道這是否會在所有的情況下工作。 type(lambda x:x)部分只是爲了獲得類型<type 'function'>,有沒有更好的方法來做到這一點?

+0

['inspect.ismethod'](http://docs.python.org/2/library/inspect.html#inspect.ismethod) – roippi

回答

6

在Python 2中,使用inspect.ismethod()

return inspect.ismethod(getattr(klass, methodName)) 

對於Python 3,非綁定方法都走了,你會使用inspect.isfunction()代替。

您還可以使用types.MethodType type object再次進行測試:

import types 

isinstance(getattr(klass, methodName), types.MethodType) 

兩個試驗@classmethod方法和常規方法的工作。 按設計這些測試對於@staticmethod方法失敗;這些只是抵制綁定的函數(cls.staticmethod.__get__(instance, cls)返回函數本身)。您可以使用inspect.isfunction()測試功能,或使用isinstance(obj, (types.MethodType, types.FunctionType))在一次測試中捕獲所有3個功能。

如果您只想測試是否可以調用,則可以使用callable() function。它會工作,即使對象是一個實例與__call__方法:

>>> class MyCallable(object): 
...  def __call__(self): 
...   return "Hello World!" 
... 
>>> mc = MyCallable() 
>>> callable(mc) 
True 
>>> mc() 
'Hello World!' 

使用callable()作品在所有3個方法「類型」以及自定義對象,如上述。請注意,,作爲工廠,也可以調用。

+0

大!但是,你推薦哪一個?在這三種情況下,所有這些都會奏效嗎? –

+0

只是好奇 - 如果方法不存在,OP的原始代碼不會拋出錯誤。因此,用getattr(klass,methodName,None)來保持這個功能不是更好嗎?或者我錯了? – iCodez

+0

@iCodez:當然,你可以使用默認設置並且可以工作。然而,這不是我正在關注的問題,因爲這是一個與手頭問題有點正交的小細節。 –

3

使用可調用。

實施例:

>>> def func(): pass 
>>> callable(func) 
>>> True 
相關問題