Python 类型错误:__init__() 需要至少 2 个参数(给定 1 个)错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12947599/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
TypeError: __init__() takes at least 2 arguments (1 given) error
提问by Joyfulgrind
I am developing a simple text based Dungeon game using Python3. First the user is prompted to select the hero from screen.py file.
我正在使用 Python3 开发一个基于文本的简单地牢游戏。首先提示用户从 screen.py 文件中选择英雄。
from game import *
class GameScreen:
'''Display the current state of a game in a text-based format.
This class is fully implemented and needs no
additional work from students.'''
def initialize_game(self):
'''(GameScreen) -> NoneType
Initialize new game with new user-selected hero class
and starting room files.'''
hero = None
while hero is None:
c = input("Select hero type:\n(R)ogue (M)age (B)arbarian\n")
c = c.lower()
if c == 'r':
hero = Rogue()
elif c == 'm':
hero = Mage()
elif c == 'b':
hero = Barbarian()
self.game = Game("rooms/startroom", hero)
def play(self):
'''(Game) -> NoneType
The main game loop.'''
exit = False
while not exit:
print(self)
if self.game.game_over():
break
c = input("Next: ")
if c in ['q', 'x']:
print("Thanks for playing!")
exit = True
elif c == 'w': # UP
self.game.move_hero(-1, 0)
elif c == 's': # DOWN
self.game.move_hero(1, 0)
elif c == 'a': # LEFT
self.game.move_hero(0, -1)
elif c == 'd': # RIGHT
self.game.move_hero(0, 1)
elif c == 'r':
## RESTART GAME
self.initialize_game()
else:
pass
def __str__(self):
'''(GameScreen) -> NoneType
Return a string representing the current room.
Include the game's Hero string represetation and a
status message from the last action taken.'''
room = self.game.current_room
s = ""
if self.game.game_over():
#render a GAME OVER screen with text mostly centered
#in the space of the room in which the character died.
#top row
s += "X" * (2 + room.cols) + "\n"
#empty rows above GAME OVER
for i in list(range(floor((room.rows - 2) / 2))):
s += "X" + " " * room.cols + "X\n"
# GAME OVER rows
s += ("X" + " " * floor((room.cols - 4) / 2) +
"GAME" + " " * ceil((room.cols - 4) / 2) + "X\n")
s += ("X" + " " * floor((room.cols - 4) / 2) +
"OVER" + " " * ceil((room.cols - 4) / 2) + "X\n")
#empty rows below GAME OVER
for i in list(range(ceil((room.rows - 2) / 2))):
s += "X" + " " * room.cols + "X\n"
#bottom row
s += "X" * (2 + room.cols) + "\n"
else:
for i in range(room.rows):
for j in room.grid[i]:
if j is not None:
if j.visible:
s += j.symbol()
else:
#This is the symbol for 'not yet explored' : ?
s += "?"
s += "\n"
#hero representation
s += str(self.game.hero)
#last status message
s += room.status
return s
if __name__ == '__main__':
gs = GameScreen()
gs.initialize_game()
gs.play()
Whenever I run this code, I get this error: TypeError: init() takes at least 2 arguments (1 given) which has to do with Rogue() or other hero classes. Here's the hero.py.
每当我运行此代码时,我都会收到此错误:TypeError: init() 需要至少 2 个参数(给定 1 个),这与 Rogue() 或其他英雄类有关。这是 hero.py。
class Rogue(Tile):
'''A class representing the hero venturing into the dungeon.
Heroes have the following attributes: a name, a list of items,
hit points, strength, gold, and a viewing radius. Heroes
inherit the visible boolean from Tile.'''
def __init__(self, rogue, bonuses=(0, 0, 0)):
'''(Rogue, str, list) -> NoneType
Create a new hero with name Rogue,
an empty list of items and bonuses to
hp, strength, gold and radius as specified
in bonuses'''
self.rogue = rogue
self.items = []
self.hp = 10 + bonuses[0]
self.strength = 2 + bonuses[1]
self.radius = 2 + bonuses[2]
Tile.__init__(self, True)
def symbol(self):
'''(Rogue) -> str
Return the map representation symbol of Hero: O.'''
#return "\u263b"
return "O"
def __str__(self):
'''(Item) -> str
Return the Hero's name.'''
return "{}\nHP:{:2d} STR:{:2d} RAD:{:2d}\n".format(
self.rogue, self.hp, self.strength, self.radius)
def take(self, item):
'''ADD SIGNATURE HERE
Add item to hero's items
and update their stats as a result.'''
# IMPLEMENT TAKE METHOD HERE
pass
def fight(self, baddie):
'''ADD SIGNATURE HERE -> str
Fight baddie and return the outcome of the
battle in string format.'''
# Baddie strikes first
# Until one opponent is dead
# attacker deals damage equal to their strength
# attacker and defender alternate
if self.hp < 0:
return "Killed by"
return "Defeated"
What am I doing wrong?
我究竟做错了什么?
采纳答案by Matthew Adams
The Problem
问题
In GameScreen.initialize_game(), you set hero=Rogue(), but the Rogueconstructor takes rogueas an argument. (Said another way, the __init__of Roguerequires that roguebe passed in.) You likely have this same issue when you set hero=Mageand hero=Barbarian.
在 中GameScreen.initialize_game(),您设置了hero=Rogue(),但Rogue构造函数将其rogue作为参数。(换句话说,__init__ofRogue要求rogue传入。)当您设置hero=Mage和时,您可能会遇到同样的问题hero=Barbarian。
The Solution
解决方案
Luckily the fix is simple; you can just change hero=Rogue()to hero=Rogue("MyRogueName"). Maybe you could prompt the user for a name in initialize_game, and then use that name.
幸运的是,修复很简单;你可以hero=Rogue()改为hero=Rogue("MyRogueName"). 也许您可以提示用户输入 中的名称initialize_game,然后使用该名称。
Notes on "at least 2 arguments (1 given)"
关于“至少 2 个参数(给出 1 个)”的注释
When you see errors like this, it means that you have called a function or a method without passing enough arguments to it. (__init__is just a special method that is called when an object is initialized.) So when debugging stuff like this in the future, look at where you call a function/method, and where you define it, and make sure that the two have the same number of parameters.
当您看到这样的错误时,这意味着您调用了一个函数或一个方法,而没有向它传递足够的参数。(__init__只是一个在对象初始化时调用的特殊方法。)所以在以后调试这样的东西时,看看你在哪里调用函数/方法,在哪里定义它,并确保两者有相同数量的参数。
One thing that is sort of tricky about these kinds of errors, is the selfthat gets passed around.
关于这些类型的错误有点棘手的一件事是self被传递的错误。
>>> class MyClass:
... def __init__(self):
... self.foo = 'foo'
...
>>> myObj = MyClass()
In that example, one might think, "Weird, I initialized myObj, so MyClass.__init__was called; why didn't I have to pass in something for self?" The answer is that selfis effectively passed in whenever the "object.method()" notation is used. Hopefully that helps clear up the error and explains how to debug it in the future.
在那个例子中,人们可能会想,“奇怪,我初始化了myObj,所以MyClass.__init__被调用了;为什么我不必为 传递一些东西self?” 答案是self无论何时使用“object.method()”符号都会有效地传入。希望这有助于清除错误并解释将来如何调试它。
回答by Rohan
Class Rogue:
...
def __init__(self, rogue, bonuses=(0, 0, 0)):
...
__init__of your Rogueclass needs parameter rogue, but you are instantiating it as hero = Rogue()in initialize_game.
__init__你的Rogue类需要参数rogue,但你实例化它hero = Rogue()在initialize_game。
You need to pass some appropriate parameter to it like hero = Rogue('somename')
您需要向它传递一些适当的参数,例如 hero = Rogue('somename')

