如何测试一个对象是一个函数还是一个未绑定的方法?

Dan*_*aro 3 python introspection

def is_unbound_method(func):
    pass

def foo(): pass

class MyClass(object):
    def bar(self): pass
Run Code Online (Sandbox Code Playgroud)

我可以把什么在体内is_unbound_method,使

is_unbound_method(foo) == False
is_unbound_method(MyClass().bar) == False
is_unbound_method(MyClass.bar) == True
Run Code Online (Sandbox Code Playgroud)

??

Mar*_*ers 8

未绑定的方法__self__设置为None:

def is_unbound_method(func):
    return getattr(func, '__self__', 'sentinel') is None
Run Code Online (Sandbox Code Playgroud)

演示:

>>> foo.__self__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute '__self__'
>>> is_unbound_method(foo)
False
>>> MyClass.bar.__self__
>>> is_unbound_method(MyClass.bar)
True
>>> MyClass().bar.__self__
<__main__.MyClass object at 0x106c64a50>
>>> is_unbound_method(MyClass().bar)
False
Run Code Online (Sandbox Code Playgroud)

该属性也可用.im_self,但是__self__向前兼容.

请注意,在Python 3中,未绑定的方法已经消失; access MyClass.bar返回函数对象.因此,上述功能将始终返回False.

参见数据模型文档,在用户定义的方法部分中:

特殊的只读属性:im_self是类实例对象,im_func是函数对象

[...]

改变在2.6版本:对于Python 3向前兼容,im_func也可作为__func__和im_self作为__self__.

[...]

通过从类中检索用户定义的函数对象来创建用户定义的方法对象时,其im_self属性为None,并且方法对象被称为未绑定.