Zac Burns wrote:
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.

One option is to re-assign the object's __class__, as in:

    class XDict (dict):
        pass

    class ZDict (XDict):
        def __getitem__(self, k):
            whatever_you_want_to_do_once(self)
            result = dict.__getitem__(self, k)
            self.__class__ = XDict
            return result


The first dict subtype is needed because __class__ assignment requires that both the current and newly-assigned class be 'heap types', which the native dict is not.


--
--Bryan
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to