gpt4 book ai didi

python - 如何动态覆盖__setitem__? (没有子类)

转载 作者:太空狗 更新时间:2023-10-30 02:22:40 32 4
gpt4 key购买 nike

我无法覆盖 Python2.7 中的某些内置函数,例如“__setitem__”(尽管在我测试的以前的版本中也会出现同样的情况)

虽然我知道这很容易通过子类化来实现,但这不是我想要的,我需要能够动态覆盖这些方法。

显然,当我的类是“object”的子类时,重写的方法总是以调用原始方法结束,但当我的类不是“object”时',它有效:

>>> def new_implementation(k, v):
... print 'New implementation'
...

### class that extends object
>>> class ExtendsObject(object):
... def __setitem__(self, k, v):
... print 'ExtendsObject implementation'
...



### Checking implementation
>>> obj = ExtendsObject()
>>> obj[0]=0
ExtendsObject implementation

### trying to override setitem, no success
>>> obj.__setitem__ = new_implementation
>>> obj[0]=0
ExtendsObject implementation




### class that does NOT extends object
>>> class DoesNotExtend:
... def __setitem__(self, k, v):
... print 'DoesNotExtend implementation'
...

### Checking implementation
>>> obj_2 = DoesNotExtend()
>>> obj_2[0]=0
DoesNotExtend implementation

### overriding now works!
>>> obj_2.__setitem__ = new_implementation
>>> obj_2[0]=0
New implementation

出于某种原因,对象似乎对这些内置函数使用了一些不同的方法解析顺序。

这是一个错误吗?我做错了什么吗?

最佳答案

对于旧式类,每次需要时都会在实例上查找特殊方法。新型类仅在实例的类型 中查找特殊方法,而不是在实例的字典本身中查找 - 这就是您看到所看到的行为的原因。

(如果您不知道——新式类是直接或间接派生自 object 的类。)

关于python - 如何动态覆盖__setitem__? (没有子类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9281451/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com