Introspection and member ordering

Josiah Carlson jcarlson at uci.edu
Wed Jan 21 01:09:53 EST 2004


> Is there a way to get any sort of introspection which would return the
> content of an instance *in the order they were declared or executed*
> as opposed to alphabetical order?
> 
> Example:
> 
> >>> class a:
> ...    def __init__(self):
> ...       self.value = 12
> ...       self.avalue = 78
> >>> class b(a):
> ...    def __init__(self):
> ...       a.__init__(self)
> ...       self.bvalue = 5
> ...    def f(self):
> ...       self.z = 3
> ... 
> >>> c=b()
> >>> c.__dict__
> {'bvalue': 5, 'avalue': 78, 'value': 12}
> 
> Wrong answer, I am looking for something that would give me
> {'value':12, 'avalue':78, 'bvalue':5'}
> 
> I tried the inspect.getmembers(c) without success.
> 
> Anyone has some advice how I can get the members listed in declaration
> or execution order?

Rim,

You'd have to either overload the class's __getattribute__, __setattr__
and __delattr__ methods, or replace the builtin instance.__dict__
attribute with a new dictionary-like object that will produce the
ordering you want.

As an option, I've written an LRU that does such kinds of updates
quickly, though it also updates on read.  Reading the comment at the
bottom will allow you to translate the update on read, to only updating
on write.  The recipe is available here:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252524

Doing a quick check, it doesn't look like you can say:
self.__dict__ = NON_DICT_OBJECT

Making LRU a subclass of dict seems to work on the surface, but it looks
to break a few things.  Perhaps I should rewrite LRU to be more Pythonic.

Until then, you'll have to update __getattribute__, __setattr__ and
__delattr__.

 - Josiah




More information about the Python-list mailing list