Rebinding __setattr__
Maric Michaud
maric at aristote.info
Mon Sep 15 07:12:54 EDT 2008
Le Monday 15 September 2008 01:06:08 Jan Schilleman, vous avez écrit :
> Hi all,
>
> I am trying to redefine __setattr__.
>
> The base class is in a library (actually, it is
> win32com.client.DispatchBaseClass) and I do not want to touch it. My
> problem is exemplified below. To my surprise, __setattr__ and __str__
> behave differently; I can redefine __str__ and the inherited __str__ is
> still the redefined one. But redefining __setattr__ on the base class does
> not get inherited. In Base.__dict__ the __setattr__ is the one I expected,
> but it is not called from B.
>
> What is the problem? Is __setattr__ cached somewhere [and not updated?]?
>
Yes, it doesn't work with classic classes, but do with new-style ones, I don't
know if this an accepted behavior or not.
Can't you use new-style classes ?
>>>[2]: sys.version
...[2]: '2.5.2 (r252:60911, May 28 2008, 19:19:25) \n[GCC 4.2.4 (Debian
4.2.4-1)]'
>>>[64]: class A :
def __setattr__(self, name, value) :
print "A", name
....:
....:
>>>[67]: class B(A) : pass
....:
>>>[68]: A().c, B().c = 1, 2
A c
A c
>>>[69]: A.__setattr__ = lambda s, n, v : sys.stdout.write("%s, %s, %s\n" %
(s, n, v))
>>>[70]: A().c, B().c = 1, 2
<__main__.A instance at 0x2b3b41546290>, c, 1
A c
>>>[71]: class A(object) :
def __setattr__(self, name, value) :
print "A", name
....:
....:
>>>[74]: class B(A) : pass
....:
>>>[75]: A().c, B().c = 1, 2
A c
A c
>>>[76]: A.__setattr__ = lambda s, n, v : sys.stdout.write("%s, %s, %s\n" %
(s, n, v))
>>>[77]:
>>>[78]: A().c, B().c = 1, 2
<__main__.A object at 0x2b3b45dfa350>, c, 1
<__main__.B object at 0x2b3b45dfa350>, c, 2
--
_____________
Maric Michaud
More information about the Python-list
mailing list