你如何检查是否绑定了python方法?

时间:2008-09-10 00:31:11

标签: python python-datamodel

给定对方法的引用,有没有办法检查方法是否绑定到对象?你还可以访问它绑定的实例吗?

5 个答案:

答案 0 :(得分:38)

def isbound(method):
    return method.im_self is not None

def instance(bounded_method):
    return bounded_method.im_self

User-defined methods:

  

当用户定义的方法对象是   通过检索用户定义的   它来自一个类的函数对象   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