class attrExample(dict): """Example of overloading __getatr__ and __setattr__ This example creates a dictionary where members can be accessed as attributes """ def __init__(self, indict=None, attribute=None): if indict is None: indict = {} # set any attributes here - before initialisation # these remain as normal attributes self.attribute = attribute dict.__init__(self, indict) self.__initialised = True # after initialisation, setting attributes is the same as setting an item def __getattr__(self, item): """Maps values to attributes. Only called if there *isn't* an attribute with this name """ try: return self.__getitem__(item) except KeyError: raise AttributeError(item) def __setattr__(self, item, value): """Maps attributes to values. Only if we are initialised """ if not self.__dict__.has_key('_attrExample__initialised'): # this test allows attributes to be set in the __init__ method return dict.__setattr__(self, item, value) elif self.__dict__.has_key(item): # any normal attributes are handled normally dict.__setattr__(self, item, value) else: self.__setitem__(item, value) if __name__ == '__main__': example = attrExample(attribute='fish') print example.attribute example.fish = 'test' print example['fish'] print example.fish