在python中,可以重写右(和左)加法运算符(<str> + <MyObject>
):
让我们将此虚拟对象用于以下操作:
class Dummy(object): pass ## dummy object
下面是一个从左到右成功重载+
运算符的示例:
也可以重写左字符串插值运算符(<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,或者有什么深层次的原因需要这样实现呢?这是设计的吗?如果是,为什么?在
非常感谢您的深入回答。在
只有当}可以处理任何类型的对象。在
__mod__
返回NotImplemented
时,才会调用__rmod__
。字符串文本"foo"
有一个功能完善的__mod__
方法,它总是能够处理操作。必须如此,因为持牌人%s
和{另一方面,
__add__
只有在另一个操作数是另一个字符串时才有效。如果不是,则给另一个对象的__radd__
一个机会。在相关问题 更多 >
编程相关推荐