On Wed, 12 Jan 2005, Barnaby Scott wrote:
> I was wondering how you can get an instance of a class to change itself > into something else (given certain circumstances), but doing so from > within a method. So: > > 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 Hi Scott, The issue with that, as you know, is that it conflicts with the way local variables work in functions. For example: ### >>> def strip_and_print(x): ... x = x.strip() ... print x ... >>> message = " hello " >>> strip_and_print(message) hello >>> message ' hello ' ### Our reassignment to 'x' in strip_and_print has no effect on "message"'s binding to " hello ". That's how we're able to use local variables as black boxes. For the same reasons, the reassignment to 'self in: > class Damson: > def __str__(self): > return 'damson' > > def dry(self): > self = Prune() is limited in scope to the dry() method. But can you do what you're trying to do with object composition? That is, would something like this work for you? ### class Damson: def __init__(self): self.state = DamsonState() def __str__(self): return str(self.state) def dry(self): self.state = PruneState() class DamsonState: def __str__(self): return "damson" class PruneState: def __str__(self): return 'prune' ### This structuring allows us to switch the way that str() applies to Damson. The OOP Design Pattern folks call this the "State" pattern: http://c2.com/cgi/wiki?StatePattern If you have any questions, please feel free to ask! _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor