
class Pet:

    # instance variables:
    # self.name
    # self.breed

    def __init__(self, n, b):
        self.name = n
        self.breed = b

    def sleep(self):
        print('Zzzzzz')


class Dog(Pet):

    # additional instance varible:
    # self.skill

    def __init__(self, n, b, s):
        # the first thing this constructor must do, is call the super class's constructor
        super(Dog,self).__init__(n, b)
        # other way:
        # Pet.__init__(self, n, b)
        self.skill = s

    def speak(self):
        print('Woof')

    def __str__(self):
        # ___ is a Dog of breed ____ and can _____
        return self.name + ' is a Dog of breed ' + self.breed + ' and can ' + self.skill

class Cat(Pet):

    def __init__(self, n, b):
        super(Cat,self).__init__(n, b)

    def speak(self):
        print('Meow')

    def __str__(self):
        # ___ is a Cat of breed ____
        return self.name + ' is a Cat of breed ' + self.breed

class TalkingDog(Dog):

    def __init__(self, n, b, s):
        #super(TalkingDog,self).__init__(n, b, s)
        Dog.__init__(self, n, b, s)

    def sleep(self):
        print('Go away. I am sleeping.')

    def speak(self):
        print('Hello, my name is ' + self.name + '.')
        
    def __str__(self):
        return Dog.__str__(self) + ' and speaks English.'
    
        
