【发布时间】:2012-02-14 17:30:14
【问题描述】:
我无法在 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
出于某种原因,对象似乎对这些内置函数使用了一些不同的方法解析顺序。
这是一个错误吗?我做错了吗?
【问题讨论】:
标签: python overriding python-2.7 built-in