[Python-Dev] Evil setattr hack

Aahz aahz@pythoncraft.com
Sat, 19 Apr 2003 13:07:00 -0400


On Sat, Apr 12, 2003, Guido van Rossum wrote:
>
> Using the dictionary doesn't work either:
> 
>     >>> str.__dict__['reverse'] = reverse
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in ?
>     TypeError: object does not support item assignment
>     >>>
> 
> But here's a trick that *does* work:
> 
>     >>> object.__setattr__(str, 'reverse', reverse)
>     >>>
> 
> Proof that it worked:
> 
>     >>> "hello".reverse()
>     'olleh'
>     >>> 

This post inspired me to check the way new-style class instances work
with properties.  Running the following code will demonstrate that
although the __setattr__ hack is blocked, you can still access the
instance's dict.  This can obviously be fixed by using __slots__, but
that seems unwieldy.  Should we do anything?

class C(object):
    def _getx(self):
        print "getting x:", self._x
        return self._x
    def _setx(self, value):
        print "setting x with:", value
        self._x = value
    x = property(_getx, _setx)

a = C()
a.x = 1
a.x
object.__setattr__(a, 'x', 'foo')
a.__dict__['x'] = 'spam'
print a.__dict__['x']
-- 
Aahz (aahz@pythoncraft.com)           <*>         http://www.pythoncraft.com/

Why is this newsgroup different from all other newsgroups?