Я не могу переопределить некоторые встроенные функции, такие как __setitem__, в Python2.7 (хотя то же самое происходит в предыдущих версиях, которые я тестировал)
Хотя я знаюэто легко сделать с помощью подклассов, это не то, что я хочу здесь, мне нужно иметь возможность динамически переопределять эти методы.
Очевидно, когда мой класс является подклассом ' 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
По некоторым причинам, кажется, что объектыиспользуйте какой-то другой порядок разрешения методов для этих встроенных функций.
Это ошибка?Я что-то не так делаю?