gpt4 book ai didi

methods - 在 Python 3 中将方法分配给 var 时如何自动使用 self currying?

转载 作者:行者123 更新时间:2023-12-02 02:20:46 26 4
gpt4 key购买 nike

我正在编写一个上下文管理器来包装 builtins.print 函数。这很好用。然而,我遇到了一个我无法理解的 Python 行为:

每当将类的方法分配给变量以供以后调用时,第一个“self”参数似乎也会自动存储并用于所有以后的调用。

这是一个说明这一点的例子:

import functools

class Wrapper:
def wrap(self):
return self._wrapped #functools.partial(self._wrapped, self)

def _wrapped(self, *args, **kwargs):
print('WRAPPED!', *args, **kwargs)
print('..knows about self:', self)

wrapped = Wrapper().wrap()
wrapped('expect self here', 'but', 'get', 'all', 'output')

输出:

WRAPPED! expect self here but get all output
..knows about self: <__main__.Wrapper object at 0x2aaaab2d9f50>

当然,对于普通函数(在类之外),这种魔法不会发生。我什至可以直接在上面的示例中分配该方法,而无需通过实例化:

wrapped = Wrapper._wrapped
wrapped('expect self here', 'but', 'get', 'all', 'output')

现在我得到了我最初的预期:

WRAPPED! but get all output
..knows about self: expect self here

在我的原始代码中,我使用 functools.partial 来柯里化(Currying) self,但后来发现这甚至不是必需的。

我喜欢当前的行为,但我还不理解关于一致性和“显而易见”的推理。

我在这里使用 Python 3.1.2。

this question与使用 types.MethodType 的答案有关吗?在此处和“网络”中搜索主要会得到有关 currying/partial 函数调用和 arg 列表的打包/解包的基本信息。也许我使用了不恰当的搜索词(例如“python currying methods”。)

任何人都可以阐明这种行为吗?

这在 Py2 和 Py3 中是否相同?

最佳答案

无论何时从实例中获取方法(如 return self._wrapped),self 都会被记住。

每当您从类中获取方法(如在 Wrapper._wrapped 中)时,self 就不会(不能)被记住。

举个例子,试试这个:

upper = 'hello'.upper
print(upper())

upper = str.upper
print(upper())

您会看到 HELLO,然后是 TypeError: descriptor 'upper' of 'str' object needs an argument

关于methods - 在 Python 3 中将方法分配给 var 时如何自动使用 self currying?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8338782/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com