automatic accessors to a member var dict elements?

Jeff Shannon jeff at ccvcorp.com
Fri Oct 15 21:36:43 CEST 2004


Jeff Shannon wrote:

> Nick Craig-Wood wrote:
>
>> I know there is something different about new style classes in this
>> area, but thats not it!
>
>
> Hmmm... Actually, I think that the problem here is that during 
> __init__(), we're trying to set the attribute m_dict, which doesn't 
> exist yet, so it tries to look in self.m_dict to find it...
>
> Modifying __init__() so to use self.__dict__['m_dict'] instead of 
> self.m_dict will likely fix this.  (But I still haven't tested it...)


And, because I'm slacking off on my real work:

 >>> class MyClass(object):
...     def __init__(self):
...         self.__dict__['m_dict'] = {'one':1, 'two':2, 'three':3}
...     def __getattr__(self, attr):
...         try:
...             value = self.m_dict[attr]
...         except KeyError:
...             raise AttributeError(attr)
...         return value
...     def __setattr__(self, attr, value):
...         self.m_dict[attr] = value
...        
 >>>
 >>> obj = MyClass()
 >>> obj.one
1
 >>> obj.two
2
 >>> obj.one = 'won'
 >>> obj.one
'won'
 >>> obj.four = 4
 >>> obj.m_dict
{'four': 4, 'three': 3, 'two': 2, 'one': 'won'}
 >>> obj.five
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "<interactive input>", line 8, in __getattr__
AttributeError: five
 >>>

Hm, that error message is a bit weak.  If we replace the 'raise 
AttributeError(attr)' with '''raise AttributeError("%s instance has no 
attribute '%s'" % (self.__class__.__name__, attr))''', we'll get an 
error message that's much more in line with a 'normal' AttributeError.

 >>> obj.five
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "<interactive input>", line 8, in __getattr__
AttributeError: MyClass instance has no attribute 'five'
 >>>

Jeff Shannon
Technician/Programmer
Credit International





More information about the Python-list mailing list