Python 检查函数是否是某个对象的方法

Python 检查函数是否是某个对象的方法,python,function,methods,Python,Function,Methods,如何检查函数是否是某个对象的方法 例如: def check_method(f): ... check_method(lambda x: x + 1) # >>> False check_method(SomeClass().some_method) # >>> True 在我的“helloworld”示例中,方法中有一些特殊的属性(例如“im_self”、“u_self”等)。我可以依靠它们吗?或者有更好的方法吗?使用 文件

如何检查函数是否是某个对象的方法

例如:

def check_method(f):
    ...

check_method(lambda x: x + 1)           # >>> False
check_method(SomeClass().some_method)  # >>> True
在我的“helloworld”示例中,方法中有一些特殊的属性(例如“im_self”、“u_self”等)。我可以依靠它们吗?或者有更好的方法吗?

使用

文件规定:

如果对象是用Python编写的绑定方法,则返回true


这意味着它将按照您在Python中定义的类的预期工作。但是,对于内置类(如
list
或在扩展模块中实现的类)的方法,它将返回
False

问题的一个转折点是询问是否可以使用某个函数名作为方法。因为duck类型被认为是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))
但对于Python3和3.1,至少您需要返回已删除的callable()。可以找到一个关于想要把它带回来的讨论 重新调用,例如:

def callable(obj):
    return isinstance(obj, collections.Callable) 
这直接来自上面提到的python bugtracker。 其他提及

这会将hasattr添加到调用中。 在我的用例中,两者都可以很好地工作

>>> bstr = b'spam'
>>> str = 'eggs'
>>> hasmethod(str, 'decode')
False
>>> hasmethod(bstr, 'decode')
True

有关更多详细信息,请查看已引用的

,也可以对照内置中定义的类型进行检查:


注意:这只适用于py3中的绑定方法,因为py3中不再有未绑定方法,它将只是一个函数。但是,它在py2中对这两种情况都有效。
>>> bstr = b'spam'
>>> str = 'eggs'
>>> hasmethod(str, 'decode')
False
>>> hasmethod(bstr, 'decode')
True
import types
isinstance(obj.method, types.MethodType) # True