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