class Cat ():
    scientificName = 'felis catus'
    numCats = 0
    
    def __init__(self, name = "fluffy"):
        self.name = name
        Cat.numCats = Cat.numCats + 1
        self.id = Cat.numCats

    def __repr__(self):
        return ('<Cat named {}. ID: {}>'.format(self.name, self.id))

    def speak(self):       
        print("meow")

    def setName(self, name):
        self.name = name
        
    def getName(self):
        return self.name
    
class Dog ():

    def __init__(self, name = "rover"):
        self.name = name
        
    def __repr__(self):
        return ('<Dog named {}.>'.format(self.name))
    
    def speak(self):
        print("woof")

    def fetch(self):
        print("I am fetching")

    def setName(self, name):
        self.name = name

    def getName(self):
        return self.name


def testCatDogV2():
    c1 = Cat()
    c2 = Cat()
    d = Dog("spot")
    for animal in [c1, c2, d]:
        print(animal)
        animal.speak()
    
