"""
Module containing a superclass Animal, with 
subclasses Bird, Parrot, and Penguin.

Author: Anne Bracy (awb93) and Lillian Lee (ljl2)
Date:   April 16, 2018
"""

class Animal():
    """
    An instance is a single animal with a name and an id number.
    """
    # Class Attribute
    NUM_ANIMALS = 0
    CAN_FLY = False
    CAN_SPEAK = False

    # BUILT-IN METHODS
    def __init__(self, name="NoName"):
        """
        Creates a new Animal with a unique tag number.
        name: name of animal [str]
        """
        # Instance attributes
        assert type(name) == str
        self.name = name
        self.tag_no = Animal.NUM_ANIMALS
        Animal.NUM_ANIMALS = Animal.NUM_ANIMALS + 1

    def __str__(self):
        return type(self).__name__+": tag="+str(self.tag_no)+", NAME="+self.name+", FLY="+str(self.CAN_FLY)+", SPEAK="+str(self.CAN_SPEAK)

    def set_name(self, name):
        assert type(name) == str
        self.name = name

class Bird(Animal):
    """
    An instance is a bird.
    """
    CAN_FLY = True
    
class Parrot(Bird):
    """
    An instance is a parrot.
    """
    CAN_SPEAK = True  # override the default


class Penguin(Bird):
    """
    An instance is a penguin.
    """
    CAN_FLY = False  # override the default