John [H2O] wrote: > > > spir wrote: >> >> What you're looking for is a dictionary... >> s = {"cheese":"Brie", "country":"France", ...} >> >> Or maybe a kind of object type that works ~ like a dict, but with object >> syntax (get rid of {} and "" for keys). Example: >> >> class Stuff(object): >> def __iter__(self): >> return iter(self.__dict__.items()) >> def items(self): >> return self.__dict__ >> >> stuff = Stuff() >> stuff.cheese="Brie" >> stuff.country="France" >> print stuff.cheese, stuff.country >> print stuff.items() >> for st in stuff: >> print " ", st >> ==> >> Brie France >> {'cheese': 'Brie', 'country': 'France'} >> ('cheese', 'Brie') >> ('country', 'France') >> >> >> Denis >> ------ >> la vita e estrany >> _______________________________________________ >> Tutor maillist - Tutor@python.org >> http://mail.python.org/mailman/listinfo/tutor >> >> > > > Denis, > > This is working, but what would be ideal is to have 'best of both' worlds. > Is there a way to combine this class with a dict, so that I can do both:
If you want to control attribute access, override its __getattr__ and __setattr__. If you want to make a dict lookalike, override its __getitem__ and __setitem__ or inherit from dict. Knowing this, you can do this: class SuperDict(dict): def __getattr__(self, attr): return self[attr] def __setattr__(self, attr, value): self[attr] = value >>> S = SuperDict() >>> S.foo = 42 >>> S['bar'] = 100 >>> S.bar 100 >>> S['foo'] 42 >>> S.items() [('foo', 42), ('bar', 100)] >>> S['this'] = 'is great' >>> S.this 'is great' >>> S.this = 'is even better' >>> S['this'] 'is even better' _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor