[Tutor] Changing a class into a subclass
Ismael Garrido
ismaelgf at adinet.com.uy
Fri Mar 25 03:43:54 CET 2005
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
More information about the Tutor
mailing list