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

Reply via email to