为什么使用闭包将函数绑定到对象是错误的?

时间:2019-02-28 14:21:11

标签: python

我希望绑定函数可以访问a。但是,我读到这种方法是错误的。为什么错了?并且,请提供推荐方法的示例。

class Some(object):

    a = 1

    def __init__(self, function):

        self.function = function(self)

    def method(self):

        print(self.a)


def function(self):

    def inner():

        print(self.a)

    return inner

thing = Some(function)

thing.function()

1 个答案:

答案 0 :(得分:5)

我不知道您在哪里读到这种方法是错误的,但是这种说法肯定有一个解释,所以也许您应该发布链接?

但是无论如何:如果重点是添加每个实例的方法,那么已经有一种内置的方法。 As explained here,python函数实现了描述符协议,因此func.__get__(obj, type(obj))将返回一个绑定方法(它本身是函数,实例和类的可调用包装器)。 IOW,将功能转变为绑定到实例的方法所需要做的就是手动调用描述符协议:

class Other(object):
    a = 1

    def __init__(self, func):
        self.func = func.__get__(self, type(self))


def f(self):
    return self.a

o = Other(f)
print("o.func :", o.func())

您的函数当然需要将实例作为第一个参数...

如果要向类本身添加方法,则更加简单,只需将函数绑定到类,属性解析(object.__getattribute__())就会调用描述符协议本身。

因此,解决方案是否“错误”取决于您如何定义“错误”。至少在技术上是合法的,可以正常工作,并且没有明显的缺点(或者至少我看不到任何缺点)-但这不是“显而易见的”解决方案(不过the definition of "obvious" may vary