【问题标题】:The code is giving TypeError代码给出 TypeError
【发布时间】:2017-08-08 05:04:45
【问题描述】:
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)

这里有人指出我的错误。我认为代码中缺少部分。可能是用最新版本编写的导致此错误。我试图在 super 中传递参数,但每次都遇到一种新的错误。

【问题讨论】:

  • 你在super987654324@中尝试传递什么样的参数
  • 试图通过本地
  • 我应该传递什么样的参数以及获得所需输出的参数是多少?
  • 为什么要使用 Python 2 而不是 Python 3 进行新开发?
  • __name__health 等类属性在__init_ 方法中被实例属性所遮蔽,它们的意义何在?你为什么使用name mangling

标签: python typeerror superclass


【解决方案1】:

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

super(Wizard, self)

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

查看docs for super了解更多详情

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

【讨论】:

  • 确保例如你在同一类的__str__ 中再次使用super
【解决方案2】:

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

看这里:

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

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

现在,当我在 Python3 中运行您的代码时,我没有收到任何错误。

【讨论】:

    【解决方案3】:

    此代码在 Python 3.x 上运行良好。

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

    super().__init__(name, health, experience)
    

    super(Wizard, self).__init__(name, health, experience)
    

    在 2.x 中,你应该为 super() 的参数写 'own class name' 和 'self'。

    【讨论】:

      猜你喜欢
      • 2020-01-15
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 2014-08-06
      相关资源
      最近更新 更多