给定对方法的引用,有没有办法检查方法是否绑定到对象?你还可以访问它绑定的实例吗?
答案 0 :(得分:38)
def isbound(method):
return method.im_self is not None
def instance(bounded_method):
return bounded_method.im_self
当用户定义的方法对象是 通过检索用户定义的 它来自一个类的函数对象
im_self
属性为None
方法对象据说是未绑定的。 通过检索a创建一个 用户定义的函数对象来自 通过它的一个实例,它的类im_self
属性是实例,并且 方法对象据说是绑定的。 在任何一种情况下,新方法im_class
属性是来自的类 检索发生,和 其im_func
属性是原始属性 功能对象。
在Python 2.6 and 3.0中:
实例方法对象有新功能 对象和函数的属性 包括该方法;新的同义词
im_self
的{{1}}和__self__
也可以im_func
获得。老人 Python仍支持名称 2.6,但在3.0中消失了。
答案 1 :(得分:16)
在python 3中,__self__
属性仅在绑定方法上设置 。在普通函数(或未绑定的方法,它们只是python 3中的普通函数)中没有设置为None
。
使用类似的东西:
def is_bound(m):
return hasattr(m, '__self__')
答案 2 :(得分:4)
所选答案在几乎所有情况下都有效。但是,在使用所选答案检查装饰器中是否绑定了方法时,检查将失败。考虑这个示例装饰器和方法:
def my_decorator(*decorator_args, **decorator_kwargs):
def decorate(f):
print(hasattr(f, '__self__'))
@wraps(f)
def wrap(*args, **kwargs):
return f(*args, **kwargs)
return wrap
return decorate
class test_class(object):
@my_decorator()
def test_method(self, *some_params):
pass
装饰器中的print
语句将打印False
。
在这种情况下,除了使用参数名称检查函数参数并查找名为self
的函数参数之外,我找不到任何其他方法。这也是不保证完美地工作,因为方法的第一个参数不被强制命名为self
并且可以有任何其他名称。
import inspect
def is_bounded(function):
params = inspect.signature(function).parameters
return params.get('self', None) is not None
答案 3 :(得分:3)
im_self attribute(仅限Python 2)
答案 4 :(得分:0)
同时适用于Python 2和3的解决方案很棘手。
使用软件包six
,一种解决方案是:
l
在Python 2中:
def is_bound_method(f):
"""Whether f is a bound method"""
try:
return six.get_method_self(f) is not None
except AttributeError:
return False
属性,因此im_self
将引发six.get_method_self()
,这将返回AttributeError
False
属性设置为im_self
,因此它将返回None
False
属性设置为非im_self
,因此它将返回None
在Python 3中:
True
属性,因此__self__
将引发six.get_method_self()
,这将返回AttributeError
False
False
属性(设置为非__self__
),因此它将返回None