如何检查函数是否是某个对象的方法?
例如:
def check_method(f):
...
check_method(lambda x: x + 1) # >>> False
check_method(SomeClass().some_method) # >>> True
我的'helloworld'示例中的方法中有一些特殊属性(例如'im_self','__ self__'等)。我能依靠它们还是有更好的方式?
答案 0 :(得分:17)
文档说明:
如果对象是用Python编写的绑定方法,则返回true。
这意味着它可以用于您在Python中定义的类。但是,对于内置类(如list
)或扩展模块中实现的类的方法,它将返回False
。
答案 1 :(得分:4)
还可以检查内置docs中定义的类型:
import types
isinstance(obj.method, types.MethodType) # True
答案 2 :(得分:3)
问题的一个转折涉及要求检查某个函数 name 是否可用作方法。因为鸭子打字被认为是pythonic,所以应该有一个简单的
hasmethod(obj, 'some_method')
但似乎没有。
鸭子打字似乎最好只需尝试:
try:
obj.some_method()
except:
# try something else
如果有人想要一个函数以编程方式检查一个对象是否有一个带有某个变量名的方法,那么就提到了以下函数:
def hasmethod(obj, method_name):
return hasattr(obj, method_name) and callable(getattr(obj, method_name))
但是对于Python 3和3.1,至少你需要得到callable(),它被删除了。可以找到关于将其恢复的讨论in a python bug entry Resurrect可以通过例如:
进行调用def callable(obj):
return isinstance(obj, collections.Callable)
这是直接来自上面提到的python bugtracker。 其他sources on stackoverflow提及
callable = lambda o: hasattr(o, '__call__') or isinstance(o, collections.Callable)
将hasattr添加到调用中。 两者都可以在我的用例中正常工作
>>> bstr = b'spam'
>>> str = 'eggs'
>>> hasmethod(str, 'decode')
False
>>> hasmethod(bstr, 'decode')
True
有关详细信息,请查看已引用的other question