object changing itself to another object
Andrew Thompson
andrew.thompson at ashecastle.com
Thu Sep 26 04:25:59 EDT 2002
Smalltalk (at least the Digitalk versions) provide a means for an object
changing into another object via the #become: message.
-----Original Message-----
From: python-list-admin at python.org [mailto:python-list-admin at python.org]
On Behalf Of Eric Brunel
Sent: 26 September 2002 09:22
To: python-list at python.org
Subject: Re: object changing itself to another object
Glen Murphy wrote:
> I'm creating a program that takes user input, and passes it to an
object -
> however, I want that object itself, and not the parent to change where
> that input goes. In the highly simplified example below, I would like
the
> output to be "Obj1","Obj2","Obj1" - but not suprisingly, I just get
Obj1,
> Obj1, Obj1
>
>
> ### code begin ###
>
> class Obj1:
> def key1(self):
> # do obj1 specific stuff
> self = Obj2()
> print "Obj1"
>
> class Obj2:
> def key1(self):
> # do obj1 specific stuff
> self = Obj1()
> print "Obj2"
>
> a = Obj1()
>
> # simulate user keypresses
> a.key1()
> a.key1()
> a.key1()
>
> ### code end ###
>
> I know I could achieve the result I want by doing horribly complicated
> trees of ifs and such, but I'd like my code to be nice and expandable
(in
> this example, to easily add new Objs). I've looked through the Python
FAQ,
> Google Groups and Various O'Reilly books, but I don't really know the
> terminology for what I'm looking for, so I haven't found anything so
far,
> so does anyone have any pointers?
AFAIK, there's no way to do exactly what you request. In fact, I've
never
seen a language allowing to dynamically change the class of an object
once
it's been created. But there's a quite simple workaround using a factory
object. For example:
class Obj1:
...
class Obj2:
...
class ObjFactory:
def __init__(self):
self.__theClasses = [Obj1, Obj2]
self.__classIndex = 0
self.__theObject = None
def getObject(self):
self.nextObject()
return self.__theObject
def nextObject(self):
self.__theObject = self.__theClasses[self.__classIndex]
self.__classIndex = (self.__classIndex + 1) / len(self.__theClasses)
And now, it does what you want:
a = ObjFactory()
a.getObject().key1() # Called on Obj1
a.getObject().key1() # Called on Obj2
a.getObject().key1() # Called on Obj1
I don't know if it suits your needs exactly, but you get the idea... And
since the actual objects are created by the factory, you can make them
know
the factory and call themselves the nextObject method when needed
instead
of calling it systematically in getObject.
HTH
--
- Eric Brunel <eric.brunel at pragmadev.com> -
PragmaDev : Real Time Software Development Tools -
http://www.pragmadev.com
--
http://mail.python.org/mailman/listinfo/python-list
More information about the Python-list
mailing list