Вы уже перезаписываете себя, но изменение действительно только локально в пределах fun () .Я добавил пару распечаток, чтобы попробовать это:
def fun(self, *args, **kwargs):
print self, self.o
self = self.o # here want to swap
print self, self.o
В выводе показаны оригинальные Wrapper и A в self и self.o, затем A и traceback, поскольку self.o недопустим в классе A.
<__main__.Wrapper object at 0xb77be38c> <__main__.A object at 0xb77be34c>
<__main__.A object at 0xb77be34c>
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/tmp/python-2803VQb.py", line 21, in <module>
print w.fun() # some operation after which I want to loose Wrapper
File "/tmp/python-2803VQb.py", line 8, in fun
print self, self.o
AttributeError: 'A' object has no attribute 'o'
Изменение себя и побочных эффектов плохо.Почему бы не назначить w непосредственно в коде вызова:
print w.fun() # some operation after which I want to loose Wrapper
w = a # Sure you will loose the Wrapper
print a is w # this goes False and I'd like True :)