Barnaby Scott wrote:
class Damson: def __str__(self): return 'damson' def dry(self): self = Prune()
class Prune: def __str__(self): return 'prune'
weapon = Damson() weapon.dry() print weapon
[...]
but something in me suggests it should produce
prune
After all, 'self' refers to the instance 'weapon'.
Ah, but 'self' is a method-local name. You're re-binding that name, not affecting the object (previously) pointed to by the name. And of course, when the method returns, those local bindings go away.
Obviously one could reassign weapon to a Prune outside the class definition, but I was hoping to write something in which, given certain circustances arising, the instance would change itself into something else.
As others have mentioned, you can change the type of the object by assigning to self.__class__, but this can get a bit hairy. Your class/instance knows nothing about what names it may be bound to, so it can't rebind those names to a different object (i.e. class Damson, and any instances you create, know nothing of the name 'weapon').
I tend to favor the explicit approach of having weapon.dry() *return* a different object, and then using 'weapon = weapon.dry()'. But if you really need to have objects that change their type as a side-effect of a method call, you can use a proxy or adapter -- in essence, you have a class that can *contain* either a Damson or a Prune, and which forwards method calls / attribute accesses to its contained object.
Jeff Shannon Technician/Programmer Credit International
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor