Alan Gauld wrote:


Absolutely, looks like you answered your own question... :-)

But if you want an OOP approach thre are some things to try.
First you can create a BuildingFactory class that has a
single instance (or indeed no instances because you could
use a static method... or get really fancy and create a
meta-class!). The factory class then takes the XML string
fragment and figures out which subclass of Building to
create and returns the required object. You can avoid
having to recode the factory class each time by using a
dictionary object and each subclass definition adds an entry
to the Factory class dictionary - possibly by calling a
class method of Building in the __init__() code


My current aproach is something like that. I subclassed Building(Building) :-) and wrote there the "factory" which returns self of the created instance. But that didn't go with all my other classes that have, as a design rule, that they manage the loading and saving from/to XML. That meant that Building was different to the other classes, and instead of doing:
a = Ship()
a.fromXML(xml)
listOfA.append(a)


I had to do:
a = Building()
listOfBuildings.append(a.fromXML(xml))

When I wrote my "factory" I thought about the dictionary approach, but I didn't write it because I hoped I could find something like the __class__ thing. Which, btw, is pure magic :-)

But there's something that I couldn't understand. In the following code, my guess would be that "I'm back from the death" would never get printed... but it is... and twice! Why?

>>> class A:
   def pong(self):
       print self.__class__
       print "Ping!"
       self.times -=1
       if self.times >= 0:
           self.__class__ = B
           self.pong()

>>> class B:
   def pong(self):
       print self.__class__
       print "Pong!"
       self.times -=1
       self.__class__ = A
       self.pong()
       print "I'm back from the death"

>>> a = A()
>>> a.times = 3
>>> a.pong()
__main__.A
Ping!
__main__.B
Pong!
__main__.A
Ping!
__main__.B
Pong!
__main__.A
Ping!
I'm back from the death ##Weird!
I'm back from the death
>>> a.__class__
<class __main__.A at 0x00C1AF00>



Thanks, Ismael _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor

Reply via email to