automatic accessors to a member var dict elements?

Nick Craig-Wood nick at craig-wood.com
Fri Oct 15 07:46:35 CEST 2004


Christopher J. Bottaro <cjbottaro at alumni.cs.utexas.edu> wrote:
>  If I have the following class:
> 
>  class MyClass:
>          def __init__(self):
>                  m_dict = {}
>                  m_dict['one'] = 1
>                  m_dict['two'] = 2
>                  m_dict['three'] = 3
> 
>  Is there anyway to generate automatic accessors to the elements of the dict? 
>  For example, so I could say:
> 
>  obj = MyClass()
>  obj.one # returns obj.my_dict['one']
>  obj.one = 'won' # same as obj.my_dict['one'] = 'won'
> 
>  By automatic, I mean so I don't have to write out each method by hand and
>  also dynamic, meaning if m_dict changes during runtime, the accessors are
>  automatically updated to reflect the change.

Here is an old style class way of doing it.  I think there might be a
better way with new style classes but I'm not up to speed on them!

Note care taken to set m_dict as self.__dict__["m_dict"] rather than
self.m_dict otherwise the __setattr__ will recurse!  You can put a
special case in __setattr__ if you prefer.

class MyClass:
    def __init__(self):
        self.__dict__["m_dict"] = {}
        self.m_dict['one'] = 1
        self.m_dict['two'] = 2
        self.m_dict['three'] = 3
    def __getattr__(self, name):
        return self.m_dict[name]
    def __setattr__(self, name, value):
        self.m_dict[name] = value

>>> obj = MyClass()
>>> print obj.one
1
>>> obj.one = 'won'
>>> print obj.one
won

-- 
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick



More information about the Python-list mailing list