# superCall2.py DMQ 6/20/04 " showing use of cooperative super calls " # Must call each __init__ in the MRO of a new instance once, # and only once. ## Inheritance diagram: ## Animal -> Mammal -> (Feline) -> Cat ## \ - - - -> Mammal2 - - - - - - -> / class Animal(object): _count = 0 def __init__(self): Animal._count += 1 class Mammal(Animal): _count = 0 def __init__(self): Mammal._count += 1 Animal.__init__(self) ## super(Mammal,self).__init__() class Mammal2(Animal): _count = 0 def __init__(self): Mammal2._count += 1 Animal.__init__(self) ## super(Mammal2,self).__init__() ##class Feline(Mammal): ## _count = 0 ## def __init__(self): ## Feline._count += 1 ## super(Feline,self).__init__() class Cat(Mammal, Mammal2): _count = 0 def __init__(self, name=None, sound=None): Cat._count += 1 Mammal.__init__(self) Mammal2.__init__(self) ## super(Cat,self).__init__() self.name = name self.sound = sound def talk(self): print "Cat:", self.name, "says...", self.sound def inventory(cls, indent=0): if cls is not object: print '. '*indent + cls.__name__, cls._count for C in cls.__bases__: inventory(C, indent+1) a = Animal() m = Mammal() c = Cat('Garfield','Meow') c.talk() inventory(Cat)