代码给出了TypeError

时间:2017-08-08 05:04:46

标签: python typeerror superclass

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

我尝试将此代码编译为py 2.7.11,但它提供了此输出

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)

任何人都可以指出我的错误。我认为代码中缺少一部分。可能是它是用最新版本编写的,导致了这个错误。我试图在超级中传递参数但每次都遇到一种新的错误。

3 个答案:

答案 0 :(得分:1)

在Python2 super()中引用cls(类)和self(类实例)作为参数。

看看这里:

https://stackoverflow.com/a/5066411/6654077

  

super()不应被视为调用基类方法的标准方法。这与Python 3.x没有变化。唯一改变的是你不需要传递参数self,cls在标准情况下,self是当前函数的第一个参数,cls是当前正在定义的类。

现在,当我在Python3中运行你的代码时,我没有错误。

答案 1 :(得分:1)

这里调用super的正确方法是使用以下参数:

super(Wizard, self)

因为python2中的super需要参数(在python3中它可以只做super()

查看docs for super了解更多详情

编辑:在您的代码中,这个错误似乎重复了多次,请记住,由于同样的问题,有些东西不能正常工作。确保仅在需要时使用super并正确使用

答案 2 :(得分:0)

此代码适用于Python 3.x。

尝试Python 3.X,或修复代码

ScriptedRecordSetWriter

super().__init__(name, health, experience)
2.x中的

,你应该为super()的参数写'自己的类名'和'self'。