[EMAIL PROTECTED] wrote: > I have an object and wish to set an attribute on it which, > unfortunately for me, is read-only. > > How can I go about this?
Can you simply subclass the object's class, intercept __setattr__ and __getattribute__, and spoof the read-only attribute? E.g.: class A(object): def get_ro(self): return 'readonly' ro = property(get_ro) class B(A): def __setattr__(self, anatt, aval): if anatt == 'ro': anatt = '_ro' super(A, self).__setattr__(anatt, aval) def __getattribute__(self, anatt): if anatt == 'ro' and hasattr(self, '_ro'): anatt = '_ro' return super(A, self).__getattribute__(anatt) The output: py> class A(object): ... def get_ro(self): ... return 'readonly' ... ro = property(get_ro) ... py> class B(A): ... def __setattr__(self, anatt, aval): ... if anatt == 'ro': ... anatt = '_ro' ... super(A, self).__setattr__(anatt, aval) ... def __getattribute__(self, anatt): ... if anatt == 'ro' and hasattr(self, '_ro'): ... anatt = '_ro' ... return super(A, self).__getattribute__(anatt) ... py> a = A() py> print a.ro readonly py> a.ro = 4 ------------------------------------------------------------ Traceback (most recent call last): File "<ipython console>", line 1, in <module> <type 'exceptions.AttributeError'>: can't set attribute py> py> b = B() py> b.x = 10 py> print b.x 10 py> print b.ro readonly py> b.ro = 4 py> print b.ro 4 I'm not so sure this is the least clunky way to do this. James -- James Stroud UCLA-DOE Institute for Genomics and Proteomics Box 951570 Los Angeles, CA 90095 http://www.jamesstroud.com/ -- http://mail.python.org/mailman/listinfo/python-list