En Thu, 19 Feb 2009 01:29:17 -0200, Alan G Isaac <alan.is...@gmail.com>
escribió:

OK, that's good.  I'd like to sometimes lock attribute creation on
instances of a class but still allow properties to function
correctly.  Will something like below be satisfactory?

   def __setattr__(self, attr, val):
     """If instance locked, allow no new attributes."""
     try:
       #get the class attribute if it exists
       p = getattr(type(self),attr)
       #if it's a descriptor, use it to set val
       p.__set__(self, val)
     except AttributeError: #no descriptor
       if hasattr(self, attr): #update val
         self.__dict__[attr] = val
       elif getattr(self, '_attrlock', False):
         raise AttributeError(
         "Set _attrlock to False to add attributes.")
       else:
         #new attributes allowed
         self.__dict__[attr] = val

The problem with using __setattr__ is that is slows down *all* attribute
writes considerably.

In particular, your code prevents using class attributes as a default
value for instance attributes (not a big deal, but I like it sometimes),
and you must remember to set a value for all attributes (even the "hidden"
ones used by any property). But if you feel OK with that, "just do it". I
think there are a few recipes in the Python Cookbook about this topic too.

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to