class Attr_Dict (dict) : def _convert_dict (self, o) : return self.__class__ (o) # end def _convert_dict def _convert_sequence (self, o) : result = [] for v in o : if isinstance (v, (list, tuple)) : result.append (self._convert_sequence (v)) elif isinstance (v, dict) : result.append (self._convert_dict (v)) else : result.append (v) if isinstance (o, tuple) : return tuple (result) return result # end def _convert_sequence def __getitem__ (self, key) : value = super ().__getitem__ (key) if isinstance (value, dict) : value = self [key] = self._convert_dict (value) if isinstance (value, (tuple, list)) : value = self [key] = self._convert_sequence (value) return value # end def __getitem__ def __getattr__ (self, name) : try : return self [name] except KeyError : raise AttributeError (name) # end def __getattr__ def __setattr__ (self, name, value) : self [name] = value # end def __setattr__ # end class Attr_Dict if __name__ == "__main__" : a = Attr_Dict (a = {"b" : 1}, b = [{"a": 1}], c = ({"a" : 1}, ))