知道一个类的成员是一个方法的最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 :(得分: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种方法“类型”以及上述自定义对象。请注意,作为工厂的类也是可调用的。
答案 1 :(得分:3)
使用callable。
示例:
>>> def func(): pass
>>> callable(func)
>>> True