我希望绑定(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/