gpt4 book ai didi

python - 为什么可以在字符串上重载 __radd__ 而不是 __rmod__ ?

转载 作者:太空宇宙 更新时间:2023-11-04 01:11:09 27 4
gpt4 key购买 nike

在 python 中,您可以覆盖右(和左)加法运算符 ( <str> + <MyObject> ):

让我们将这个虚拟对象用于以下目的:

class Dummy(object): pass  ## dummy object

这是一个成功重载 + 的例子左右运算符:

>>> Dummy.__add__ = lambda s, v: "LAdded: Dummy(), %s" % v
>>> Dummy() + "foo"
'LAdded: Dummy(), foo'

>>> Dummy.__radd__ = lambda s, v: "RAdded: %s, Dummy()" % v
>>> "foo" + Dummy()
'RAdded: foo, Dummy()'

您还可以覆盖左侧字符串插值运算符 ( <MyObject> % <str> ):

>>> Dummy.__mod__ = lambda s, v: "LModded: Dummy(), %s" % v
>>> Dummy() % "foo"
'LModded: Dummy(), foo"

但是,您不能覆盖正确的字符串插值运算符 ( <str> % <MyObject> ):

>>> Dummy.__rmod__ = lambda s, v: "RModded: %s, Dummy()" % v
>>> "foo" % Dummy()
'foo'

我们的覆盖没有被调用。

我需要一个技术答案来确认添加 +和插值% 均在 str 上实现类型。但它们的实现方式似乎不同,因此它们显然没有相同的优先级。

那么有没有办法优先于 % 的字符串实现?运算符(operator) ?如果不是,为什么可以在 + ?这可以被认为是一个错误,还是必须以这种方式实现的深层原因?这是设计使然吗?如果是,为什么?

非常感谢您的深入解答。

最佳答案

__rmod__ 仅在 __mod__ 返回 NotImplemented 时调用。您的字符串文字 "foo" 具有功能完善的 __mod__ 方法,它始终能够处理该操作。它必须这样做,因为占位符 %s%r 将适用于任何类型的对象。

另一方面,

__add__ 仅在另一个操作数是另一个字符串时才有效。如果不是,则给另一个对象的 __radd__ 一个机会。

关于python - 为什么可以在字符串上重载 __radd__ 而不是 __rmod__ ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27558871/

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