【发布时间】:2018-06-28 11:25:07
【问题描述】:
我想将此函数绑定为某个类的方法:
def foo_method(msg, self):
print self.prefix + msg
这行得通:
class A(object):
prefix = 'msg: '
A.foo = lambda *args: foo_method('hello', *args)
A().foo()
# => msg: hello
然而,这不是:
from functools import partial
class B(object):
prefix = 'msg: '
B.foo = partial(foo_method, 'hello')
B().foo()
# => TypeError: foo_method() takes exactly 2 arguments (1 given)
第一个示例似乎绑定正确,而第二个则没有。
为什么?
【问题讨论】:
-
有趣。现在调查这个。我希望这只是您正在玩的一个实验,您实际上并没有尝试将部分应用的方法动态添加到类中。
-
这里不需要
setattr。A.foo = lambda # ...也表现出这种行为。 -
我敢说这是一些奇怪的交互,因为 lambda 是一个适当的函数,而 partial 是一个 Callable(它实际上是作为一个类实现的)。
-
@BaileyParker 是的,我猜这与 partial 不是函数有关,我只是无法找到解释为什么这很重要。也许是我不理解的对象模型中的某些东西?
-
所以它位于
__getattribute__的自绑定中。A().foo产生<bound method <lambda> of ...>>和B().foo产生functools.partial(<function foo_method at ...>, 'hello')。所以看起来B__getattribute__不会自绑定。要获得答案,您必须深入研究元类的世界。
标签: python python-2.7 oop functional-programming