Using inner dict as class interface

Peter Otten __peter__ at web.de
Wed Jan 16 12:34:42 EST 2013


Steven D'Aprano wrote:

> On Wed, 16 Jan 2013 15:42:42 +0100, Florian Lindner wrote:
> 
>> Hello,
>> 
>> I have a:
>> 
>> class C:
>>    def __init__(self):
>>       d = dict_like_object_created_somewhere_else()
>> 
>>   def some_other_methods(self):
>>     pass
>> 
>> 
>> class C should behave like a it was the dict d.
> 
> Then make it a dict:
> 
> class C(dict):
>     def some_other_methods(self):
>         pass
> 
> my_dict = C(key="value")  # or C({"key": "value"})
> print len(my_dict)
> print my_dict['key']
> my_dict.some_other_methods()

If for some reason it is impractical to follow Steven's advice you can 
subclass collections.Mapping or collections.MutableMapping. That should give 
you a clear notion of the required methods and has defaults for some of 
them.

>>> class A(Mapping): pass
... 
>>> A()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class A with abstract methods 
__getitem__, __iter__, __len__
>>> class B(Mapping):
...     def __getitem__(self, key):
...             return {1:2}[key]
...     def __len__(self): return 1
...     def __iter__(self): yield 1
... 
>>> b = B()
>>> list(b)
[1]
>>> b.items()
[(1, 2)]





More information about the Python-list mailing list