# Animals_2c.py -- a complete OO zoo !! DMQ 5/19/04 # - modified to use general super calls and to recalculate dependent # variables with every access. This will allow new classes # to be inserted in the hierarchy without editing code inside existing # classes. class Animal(object): _numAnimals = 0 def numAnimals(): return Animal._numAnimals + Mammal.numMammals() numAnimals = staticmethod(numAnimals) home = "Earth" def __init__(self): if self.__class__ == Animal: Animal._numAnimals += 1 def show(): print "Inventory:" print " Animals:", Animal.numAnimals() show = staticmethod(show) class Reptile(Animal): pass class Mammal(Animal): _numMammals = 0 def numMammals(): return Mammal._numMammals + Feline.numFelines() numMammals = staticmethod(numMammals) basal_metabolic_rate = 7.2 def __init__(self, s = "Maa... Maa..."): ## Animal.__init__(self) parent = Mammal.__bases__[0] parent.__init__(self) if self.__class__ == Mammal: Mammal._numMammals += 1 self.sound = s def show(): Animal.show() print " Mammals:", Mammal.numMammals(), print " BMR =", Mammal.basal_metabolic_rate show = staticmethod(show) def talk(self): print "Mammal sound: ", self.sound class Bovine(Mammal): pass class Canine(Mammal): pass class Feline(Mammal): _numFelines = 0 def numFelines(): return Feline._numFelines + Cat.numCats() numFelines = staticmethod(numFelines) genus = "feline" def __init__(self): ## Mammal.__init__(self) parent = Feline.__bases__[0] parent.__init__(self) print self, Feline if self.__class__ == Feline: Feline._numFelines += 1 def show(): Mammal.show() print " Felines:", Feline.numFelines() show = staticmethod(show) class Cat(Feline): _numCats = 0 def numCats(): return Cat._numCats numCats = staticmethod(numCats) def __init__(self, n = "unknown", s = "Meow" ): ## Feline.__init__(self) parent = Cat.__bases__[0] parent.__init__(self) if self.__class__ == Cat: Cat._numCats += 1 self.name = n self.sound = s def show(): Mammal.show() print " Cats:", Cat.numCats() show = staticmethod(show) def talk(self): print "My name is ...", self.name print "I am a %s from %s" % (self.genus, self.home) Mammal.talk(self) print self a = Animal() m = Mammal(); print "m:",; m.talk() f = Feline(); print "f:",; f.talk() c = Cat(); print "c:",; c.talk() c.show() ##cat1 = Cat("Garfield", "Purr") ##cat1.talk() ## ##bf = cat1.talk # a bound function ##uf = Cat.talk # an unbound function ##print "bf():" ##bf() ##print "uf(cat1):" ##uf(cat1)