Search code examples
pythontypeerrorsuperclass

The code is giving TypeError


class GameCharacter(object):

    __name = ""
    __health = 0
    __experience = 0

    def __init__(self, name, health, experience):
        self.__name = name
        self.__health = health
        self.__experience = experience


    def getName(self):
        return self.__name

    def adventure( e ):
        self.__experience += e

    def __str__(self):
        return self.__name+ " is a " + str(type(self)) + " with: \n HEALTH: " \
        + str(self.__health) + " and EXPERIENCE: " + str(self.__experience)


gc = GameCharacter("gc", 10, 20)
print(gc)


class Wizard(GameCharacter):

    __spells = {}
    __knowledge = 0

    def __init__(self, name, health, experience, spells, knowledge):
        super().__init__(name, health, experience)
        self.__spells = spells
        self.__knowledge = knowledge

    def __str__(self):
        return (super().__str__() + "\n SPELLS: " + str(self.__spells) \
                + " and KNOWLEDGE: " + str(self.__knowledge))

    def learn( k ):
        self.__knowledge += k

    # This method returns damage amount which is calculated as follows:
    # select a random spell from the dictionary of spells using
    # the knowledge value as the range, damage = potency of spell 
    def castSpell():
        #?????
        pass



class Warrior(GameCharacter):

    __weapons = {}
    __skill = 0

    def __init__(self, name, health, experience, spells, skill):
        pass

    def __str__(self):
        return "This needs to be implemented..."

    #this method updates the value of __skill by  s
    def train( s ):
        pass

    # This method returns damage amount which is calculated as follows:
    # select a random weapon from the dictionary of weapons using
    # the skill value as the range, damage = strength of weapon
    def useWeapon():
        pass


wiz1 = Wizard("Wizzy", 100, 50, {}, 5 )
print(wiz1)

warr1 = Warrior("Warry", 100, 75, {}, 10)
print (warr1)

class AdventureGame():

    #initializes the game characters
    def __init__(self, wizard, warrior):
        pass

    #returns a string representing information about the game characters
    def __str__(self):
        pass

    #generates a random number in range 0-5 for wizard: wizard gains knowledge by this much
    #generates a random number in range 0-5 for warrior: warrior gains strength by this much
    def adventure(self):
        pass

    #generates a random number in range 0-5 for wizard: wizard loses knowledge by this much
    #generates a random number in range 0-5 for warrior: warrior loses strength by this much
    def peril(self):
        pass

    #wizard casts a spell
    #warrior draws a weapon
    #return the winner - who has more health, or tie --> wizard|warrior|tie
    def battle(self):
        pass

I tried to compile this code to the py 2.7.11 but it is giving this output

gc is a <class '__main__.GameCharacter'> with: 
 HEALTH: 10 and EXPERIENCE: 20

Traceback (most recent call last):
  File "C:/Users/Muhammad Danial/Desktop/sample.py", line 76, in <module>
    wiz1 = Wizard("Wizzy", 100, 50, {}, 5 )
  File "C:/Users/Muhammad Danial/Desktop/sample.py", line 34, in __init__
    super().__init__(name, health, experience)
TypeError: super() takes at least 1 argument (0 given)

Anybody here to point out my mistake. I think there is a missing part in the code. May be it is written in latest version which caused this error. I tried to pass the arguments in the super but every time faced a new kind of error.


Solution

  • The proper way to call super here is with the following arguments:

    super(Wizard, self)
    

    Because super in python2 needs the arguments (in python3 it's possible to do just super())

    Take a look at the docs for super for more details

    Edit: It appears that this mistake is repeated more times in your code, keep that in mind that some things will not work because of the same problem. Make sure you use super only when needed and use it properly