- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 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/
在 python 中,您可以覆盖右(和左)加法运算符 ( + ): 让我们将这个虚拟对象用于以下目的: class Dummy(object): pass ## dummy object 这是一
我想做的事: x %doSomething% y 除了 x 是 str 的情况外,对于任何 x 和任何 y,这很容易做到(参见下面的代码)。 有什么方法(例如添加特殊方法或引发特定错误)导致旧样式字符
我是一名优秀的程序员,十分优秀!