web-dev-qa-db-ja.com

Python:TypeError:__ init __()は正確に2つの引数を取ります(1つ指定)

この質問が何度か聞かれたことは知っていますが、私の問題の解決策を提供してくれた人は誰もいません。私はこれらを読みました:

__ init __()は正確に2つの引数を取ります(1つ与えられます)?

class __init __()は正確に2つの引数を取ります(1つ与えられます)

私がやろうとしているのは、非常にくだらないバージョンのMinecraftのように、「サバイバルゲーム」用に2つのクラスを作成することだけです。以下は、2つのクラスの完全なコードです。

class Player:
    '''
    Actions directly relating to the player/character.
    '''
    def __init__(self, name):
        self.name = name
        self.health = 10
        self.shelter = False

    def eat(self, food):
        self.food = Food
        if (food == 'Apple'):
            Food().Apple()

        Elif (food == 'pork'):
            Food().pork()

        Elif (food == 'beef'):
            Food().beef()

        Elif (food == 'stew'):
            Food().stew()

class Food:
    '''
    Available foods and their properties.
    '''
    player = Player()

    def __init__(self):
        useless = 1
        Amount.Apple = 0
        Amount.pork = 0
        Amount.beef = 0
        Amount.stew = 0

    class Amount:   
        def Apple(self):
            player.health += 10

        def pork(self):
            player.health += 20

        def beef(self):
            player.health += 30

        def stew(self):
            player.health += 25      

そして今、完全なエラーのために:

Traceback (most recent call last):
  File    "/home/promitheas/Desktop/programming/python/pygame/Survive/survive_classe  s.py", line 26, in <module>
    class Food:
  File     "/home/promitheas/Desktop/programming/python/pygame/Survive/survive_classe    s.py", line 30, in Food
    player = Player()
TypeError: __init__() takes exactly 2 arguments (1 given)

クラスを機能させたいだけです。

3
mee

使用したコードは次のとおりです。

player = Player()

これは__init__は、コードに応じてnameという1つのパラメーターで指定する必要があります。したがって、問題を解決するには、Playerコンストラクターに名前を指定するだけで、次のように設定できます。

player = Player('sdfasf')
5
Jerry

問題は、クラスPlayer's __init__関数は、Classインスタンスを初期化している間、name引数を受け入れます。最初の引数selfは、クラスインスタンスを作成するときに自動的に処理されます。だからあなたは変更する必要があります

player = Player()

player = Player('somename')

プログラムを起動して実行します。

2
Bhargav Rao

__init__()は、クラスがインスタンス化されたときに呼び出される関数です。したがって、インスタンスを作成するときに、__init__に必要な引数を渡す必要があります。だから、代わりに

player = Player()

使用する

player = Player("George")

最初の引数は暗黙のselfであり、インスタンス化するときに含める必要はありません。ただし、nameは必須です。含まれていなかったため、エラーが発生していました。

2
MattDMo

あなたのコードは、あなたが___init___に入力しないものを入力することを期待していることを知っています。
エラー__init__() takes exactly 2 arguments (1 given)がどこから来ているのかを理解できる簡単な例を以下に示しました。
私がしたことは、uselessに入力を与える定義を作成したことです。
そして私はその定義を___init___から呼んでいます。

コード例:

_class HelloWorld():
    def __init__(self):
        self.useThis(1)
    def useThis(self, useless):
        self.useless = useless
        print(useless)

# Run class 
HelloWorld()
_

def exampleOne(self)のような定義がある場合、入力は必要ありません。それ自体がtに見えます。
しかし、def exampleTwo(self, hello, world)は2つの入力を期待しています。
したがって、これら2つを呼び出すには、次のものが必要です。

_self.exampleOne()
self.exampleTwo('input1', 'input2')
_
0
Tenzin