Message23127
This *may* be a duplicate of 729913, but there's either additional
info here, or this is actually different.
The issue is that any special method (e.g. __call__, __str__, etc.)
defined for a new-style (i.e. object-based) class seems to be static
(i.e. unchangeable) with some special lookup applied for that method,
but this doesn't seem to be the case for regular methods.
class A:
def foo(self): return 1
def __call__(self): return 2
def bar(self): return 3
def adjust(self):
self.foo = self.bar
self.__call__ = self.bar
a = A()
print a.foo(), a()
a.adjust()
print a.foo(), a()
Will print:
1 2
3 3
But if the A is turned into a new-style class by changing the
first line:
class A(object):
then the printed results are:
1 2
3 2
To the best of my understanding of the migration from classic classes
to new-style classes (and metaclassing), this shouldn't occur. I have
also tried various name munging for the special method (e.g. setting
_B__call__, using setattr, etc.), but I haven't found the special trick
yet.
The attached script shows the example in more detail.
|
|
Date |
User |
Action |
Args |
2007-08-23 14:27:27 | admin | link | issue1066490 messages |
2007-08-23 14:27:27 | admin | create | |
|