我无法覆盖某些内置函数,例如 '__setitem__',Python2.7(虽然我测试的之前版本也出现同样的情况)
虽然我知道这很容易通过子类化来完成,但这不是我想要的,我需要能够动态地重写这些方法。
显然,当我的班级是 ' 的子类时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
由于某种原因,对象似乎对这些内置函数使用了一些不同的方法解析顺序。
这是一个错误吗?难道我做错了什么?
对于旧式类,每次需要时都会在实例上查找特殊方法。新式类只查找特殊方法type实例的字典,而不是实例的字典本身 - 这就是您看到您所看到的行为的原因。
(如果你不知道——新式类是直接或间接派生自object
.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)