On Jul 11, 5:29 pm, Neal Becker <[EMAIL PROTECTED]> wrote: > After spending the morning debugging where I had misspelled the name of an > attribute (thus adding a new attr instead of updating an existing one), I > would like a way to decorate a class so that attributes cannot be (easily) > added. > > I guess class decorators are not available yet (pep 3129), but probably > inheritance can be used. > > Can anyone suggest an implementation?
This article could give you same idea (it is doing the opposite, warning you if an attribute is overridden): http://stacktrace.it/articoli/2008/06/i-pericoli-della-programmazione-con-i-mixin1/ There is also a recipe that does exactly what you want by means of a metaclass: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252158 It is so short I can write it down here: # requires Python 2.2+ def frozen(set): "Raise an error when trying to set an undeclared name." def set_attr(self,name,value): if hasattr(self,name): set(self,name,value) else: raise AttributeError("You cannot add attributes to %s" % self) return set_attr class Frozen(object): """Subclasses of Frozen are frozen, i.e. it is impossibile to add new attributes to them and their instances.""" __setattr__=frozen(object.__setattr__) class __metaclass__(type): __setattr__=frozen(type.__setattr__) Of course using frozen classes is not Pythonic at all, and I wrote the recipe as a proof of concept, not to use it. Michele Simionato -- http://mail.python.org/mailman/listinfo/python-list