【发布时间】:2019-12-16 05:10:18
【问题描述】:
使用以下代码:
import types
class Foo():
def __getitem__(self, x):
return x
def new_get(self, x):
return x + 1
x = Foo()
x.__getitem__ = types.MethodType(new_get, x)
x.__getitem__(42) 将返回 43,但 x[42] 将返回 42。
有没有办法在 Python 中的实例级别覆盖 __getitem__?
【问题讨论】:
-
我确定有
-
无论如何你都不想这样做。从概念上讲,具有不同方法定义的对象不再是类的一部分。
-
如果你想要完整的故事:我想计时一些过程,所以基本上,我通过添加代码来覆盖我想要计时的实例的方法来计时对这些方法的调用,特别是,我想要打电话给
__getitem__。 (这个想法是修改一个对象,通过一些现有的代码传递它并记录它在每次调用方法时所花费的时间)。 -
Related: “implicit uses of special methods always rely on the class-level binding of the special method” (文本实际上是错误的;并非所有特殊方法都依赖于类级绑定,但你不能指望其中任何一个不这样做,它可能会因版本而异,因为它们中的任何一个都不正式支持实例级别的重新绑定)。
标签: python monkeypatching