"Zac Burns" <[EMAIL PROTECTED]> writes: > Sorry for the long subject. > > I'm trying to create a subclass dictionary that runs extra init code > on the first __getitem__ call. However, the performance of __getitem__ > is quite important - so I'm trying in the subclassed __getitem__ > method to first run some code and then patch in the original dict > method for the instance to avoid even the check to see if the init > code has been run. Various recipes using instancemethod and the like > have failed me. > > Curiously if __slots__ is not specified no error occurs when setting > self.__getitem__ but the function is not overriden. If __slots__ is > ['__getitem__'] however it complains that __getitem__ is read only. I > do not understand that behavior.
You can change the class on the fly to achieve what you want: >>> class D1(dict): ... def __getitem__(self, key): ... print 'first call' ... self.__class__ = D2 ... return dict.__getitem__(self, key) ... >>> class D2(dict): ... pass ... >>> d = D1(foo=42) >>> d['foo'] first call 42 >>> d['foo'] 42 >>> HTH -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list