Python 补丁项目分配

Python patch item assignment

假设有人想将 项目分配 添加到来自外国图书馆的 class 实例:

# defined outside our code base
class WeDoNotWantToDeriveThis(object): pass


inst = WeDoNotWantToDeriveThis()
def set_item_func(self, idx, val): print("hi there")
import types
# try to patch item setter
inst.__setitem__ = types.MethodType(set_item_func, inst)
assert hasattr(inst, '__setitem__')
print(type(inst.__setitem__)) # prints "instancemethod"
# try to perform item assignment on inst
inst[0] = None # raises 'object does not support item assignment'

问题是如何正确地做到这一点。也许'setitem'不是在实例上查找,而是在class本身上查找对象是否支持项目分配?

根据文档,实施 setitem 方法应该就足够了: https://docs.python.org/3/reference/datamodel.html#object.setitem

您必须在 class:

上设置实例方法
>>> WeDoNotWantToDeriveThis.__setitem__ = types.MethodType(set_item_func, None, WeDoNotWantToDeriveThis)
>>> inst[0] = None
hi there
>>>