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

标签 python

我希望绑定(bind)函数能够访问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()

最佳答案

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

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

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())

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

如果你想给类本身添加一个方法,那就更简单了,你只需要将函数绑定(bind)到类上,属性解析(object.__getattribute__())就会调用描述符协议(protocol)本身。

所以你的解决方案是否“错误”取决于你如何定义“错误”。至少它在技术上是合法的,它有效,并且没有明显的缺点(或者至少我没有看到任何缺点) - 但这不是“明显”的解决方案(但the definition of "obvious" may vary)

关于python - 为什么使用闭包将函数绑定(bind)到对象是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54927817/

相关文章:

javascript - 使用 django-dynamic-formset 创建表单集工厂时出错

python - 根据条件合并数据帧

python - 如何修复 '' 发现输入变量的样本数量不一致 : [219, 247 ]''

python - Django Rest中的字符串相关字段

python - 如何循环遍历行值以仅返回特定值?

python - nosetests 正在捕获我的打印语句的输出。如何规避这一点?

python - pygame圈子没有改变

Python - 在列表中搜索多个值并执行多个操作

python - 使用 str 为 init 子类化元组

python - 防止窗口最小化或关闭