如何知道一个类的成员是否是一个方法?

时间:2013-12-19 18:43:38

标签: python class oop methods

知道一个类的成员是一个方法的最pythonic方法是什么?注意:我只有(posssible)方法的名称(可以是类方法实例方法静态方法)。

目前我正在将班级字典中的对象类型与<type 'function'>进行比较:

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

我真的不知道这是否适用于所有情况。 type(lambda x:x)部分仅用于获取<type 'function'>类型,是否有更好的方法可以做到这一点?

2 个答案:

答案 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