在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"
But, 您无法覆盖正确的字符串插值运算符 (<str> % <MyObject>
):
>>> Dummy.__rmod__ = lambda s, v: "RModded: %s, Dummy()" % v
>>> "foo" % Dummy()
'foo'
我们的覆盖没有被调用。
我需要一个技术答案来确认这一补充+
和插值%
都已实施 on str
类型。但它们似乎没有以相同的方式实现,因此它们显然不具有相同的优先级。
那么有没有办法优先考虑字符串的实现%
操作员 ?如果不是,为什么可以+
?这是否可以被视为一个错误,或者是否有深层原因必须以这种方式实现?这是设计使然吗?如果是,为什么?
非常感谢您的深入解答。