Structure accessible by attribute name or index

Wes Santee wsantee at gmail.com
Wed Mar 17 17:55:07 CET 2010


On Mar 17, 11:34 am, Bruno Desthuilliers <bruno.
42.desthuilli... at websiteburo.invalid> wrote:
> Wes Santee a écrit :
>
> > I am very new to Python, and trying to figure out how to create an
> > object that has values that are accessible either by attribute name,
> > or by index.  For example, the way os.stat() returns a stat_result or
> > pwd.getpwnam() returns a struct_passwd.
>
> > In trying to figure it out, I've only come across C implementations of
> > the above types.  Nothing specifically in Python.  What is the Python
> > native way to create this kind of object?
>
> Using the appropriate __magicmethods__ for indexed access and computed
> attributes for the attribute access might be a good solution:

This is as good an excuse as any to get familiar with the rest of the
__magicmethods__. :)

>
> # warning : Q&D implementation, would require some sanity checks.
>
> class IndexedValueDescriptor(object):
>      def __init__(self, index):
>          self._index = index
>      def __get__(self, instance, cls):
>          if instance is None:
>              return self
>          return instance[self._index]
>      def __set__(self, instance, value):
>          instance[self._index] = value
>
> class Structure(object):
>      def __init__(self, value1, value2, value3):
>          self._values = [value1, value2, value3]
>      def __setitem__(self, index, value):
>          self._values[index] = value
>      def __getitem__(self, index):
>          return self._values[index]
>      value1 = IndexedValueDescriptor(0)
>      value2 = IndexedValueDescriptor(1)
>      value3 = IndexedValueDescriptor(2)
>
> Note that there are probably other solutions... Don't know how
> os.stat_result is implemented, might be worth looking at the source
> code. But anyway : the above should get you started.
>
> > I apologize if this has been widely covered already.   In searching for
> > an answer, I must be missing some fundamental concept that is
> > excluding me from finding an answer.
>
> Well, that's not really a FAQ AFAICT !-)




More information about the Python-list mailing list