Alan G Isaac a écrit :
On 2/18/2009 6:15 PM Gabriel Genellina apparently wrote:
type(a).x
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
Might be safer to call on the parent class __setattr__ instead of
directly assigning to the instance's dict Also, your tests in the except
clause could be simplified:
if not hasattr(self, attr) and getattr(self, '_attrlock', False):
raise AttributeError(yadda yadda)
# NB: assume newstyle class
super(YourClass, self).__setattr__(attr, val)
My 2 cents.
--
http://mail.python.org/mailman/listinfo/python-list