为什么你能在字符串上重载radd而不重载rmod?

2024-09-30 04:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

让我们将此虚拟对象用于以下操作:

class Dummy(object): pass  ## dummy object

下面是一个从左到右成功重载+运算符的示例:

^{pr2}$

也可以重写左字符串插值运算符(<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类型上实现的。但它们的实现方式似乎并不相同,因此它们显然不具有相同的优先级。在

那么有没有一种方法可以优先于%运算符的字符串实现呢?如果不是,为什么在+上是可能的?这是否可以被认为是一个bug,或者有什么深层次的原因需要这样实现呢?这是设计的吗?如果是,为什么?在

非常感谢您的深入回答。在


Tags: 对象lambda字符串示例objectfoo运算符pass
1条回答
网友
1楼 · 发布于 2024-09-30 04:38:30

只有当__mod__返回NotImplemented时,才会调用__rmod__。字符串文本"foo"有一个功能完善的__mod__方法,它总是能够处理操作。必须如此,因为持牌人%s和{}可以处理任何类型的对象。在

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

相关问题 更多 >

    热门问题