I am creating a basic OOP program for one of my modules at college. I am making a simple CLI RPG game using python. For a few classes I will be overloading all of the parent class's functions and I'm not sure whether I should be using polymorphism in these cases.
Example:
class character():
def __init__(self, name, hp, level, defense, damage):
    self.hp = hp + (10 * level)
    self.name = name
    self.level = level
    self.defense = defense + (10 * level)
    self.damage = damage + (10 * level)
    self.target = None
    self.invetory = []
def attack(self, target):
    hit_chance = random.random()
    print '%s %s attacked %s %s' % (self.__class__.__name__, self.name, target.__class__.__name__, target.name)
    if self.target == None:
        self.target = target
    if hit_chance <= 0.2:
        print '%s %ss\' attack missed \n' % (self.__class__.__name__, self.name)
        return
    target.attacked(self.damage, self)
    self.fighting()
def attacked(self, wound, attacker):
    wound = wound - float(self.defense) / 100 * random.randint(30, 60)
    self.hp = self.hp - wound
    print '%s %s took %s points of damage from %s %s' % (self.__class__.__name__, self.name, wound, attacker.__class__.__name__, attacker.name)
    if self.target == None:
        self.target=attacker
    if self.hp <= 0:
        print '%s has been defeated. %s is victorious!' % (self.name, attacker.name)
        attacker.victory(self.level)
        del self
        return
    print '%s %ss\' hp fell to %s\n' % (self.__class__.__name__, self.name, self.hp)
def fighting(self):
    threading.Timer(5.0, fighting).start()
    if self.target:
        attack(self.target)
        if self.target.hp <= 0:
            self.target = None
    time.sleep(2)
class player(character):
    def __init__(self, name):
        self.level = 1
        self.max_hp = 100 + 10 * self.level
        self.hp = self.max_hp
        self.name = name
        self.defense = 10 * self.level
        self.damage = 10 * self.level
        self.target = None
        self.inventory = ['bronze_dagger']
        self.xp = 0
        self.gold = 0
        self.weapon = bronze_sword
    def victory(self, level):
        self.xp = self.xp + ((level - self.level) * 20 + random.randint(10, 50))
        self.gold = level * random.randint(1, 100)
        self.hp = self.max_hp
        if self.xp >= self.level * 100:
            self.level_up()
    def attacked(self, wound, attacker):
        wound = wound - float(self.defense) / 100 * random.randint(40, 60)
        self.hp = self.hp - wound
        print '%s %s took %s points of damage from %s %s' % (self.__class__.__name__, self.name, wound, attacker.__class__.__name__, attacker.name)
        if self.hp <= 0:
            print 'You have been defeated by %s!\nGAME OVER!' % (attacker.name)
            del self
            return
        print '%s %ss\' hp fell to %s\n' % (self.__class__.__name__, self.name, self.hp)
    def level_up(self):
        self.xp = 0
        self.level = self.level + 1
        self.hp = 100 + 10 * self.level
        self.defense = 10 * self.level
        self.damage = 10 * self.level
        print '%s %s has reached level %s!' % (self.__class__.__name__, self.name, self.level)
As you can see the player class overloads all of the character class's functions and adds more functions.
 
    