Hello, I have got a problem that i can't readily solve. I want the following: I want to create a supertuple that behaves both as a tuple and as a class. It should do the following: Point=superTuple("x","y","z") # this is a class factory p=Point(4,7,9) assert p.x==p[0] assert p.y==p[1] assert p.z==p[2] I already found a recipe to do that (recipe 6.7 in the Python cookbook). I reproduce the code hereunder: def superTuple(*attribute_names): " create and return a subclass of `tuple', with named attributes " # make the subclass with appropriate _ _new_ _ and _ _repr_ _ specials typename='Supertuple' nargs = len(attribute_names) class supertup(tuple): _ _slots_ _ = ( ) # save memory, we don't need per-instance dict def _ _new_ _(cls, *args): if len(args) != nargs: raise TypeError, '%s takes exactly %d arguments (%d given)' % ( typename, nargs, len(args)) return tuple._ _new_ _(cls, args) def _ _repr_ _(self): return '%s(%s)' % (typename, ', '.join(map(repr, self))) # add a few key touches to our new subclass of `tuple' for index, attr_name in enumerate(attribute_names): setattr(supertup, attr_name, property(itemgetter(index))) supertup._ _name_ _ = typename return supertup
Now my problem is: i would like to extend this supertuple with class variables so that i can obtain the following: assert Point.x==0 assert Point.y==1 assert Point.z==2 while still having: assert p.x==p[0] assert p.y==p[1] assert p.z==p[2] This is not the case unfortunately: Point.x=0 leads to having p.x==0 It seems not possible to have class variables and instance variable having the same name and yet different values. Alain -- http://mail.python.org/mailman/listinfo/python-list