「TypeError: method() は 1 つの位置引数を取りますが、2 つ指定されています」と表示されますが、渡したのは 1 つだけです。質問する

「TypeError: method() は 1 つの位置引数を取りますが、2 つ指定されています」と表示されますが、渡したのは 1 つだけです。質問する

授業があったら…

class MyClass:

    def method(arg):
        print(arg)

...オブジェクトを作成するために使用します...

my_object = MyClass()

...私はmethod("foo")このように呼びかけます...

>>> my_object.method("foo")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 1 positional argument (2 given)

... 引数を 1 つしか指定していないのに、Python では引数が 2 つ指定されたと表示されるのはなぜでしょうか?

ベストアンサー1

Python では、次のようになります。

my_object.method("foo")

... は構文糖通訳は舞台裏で次のように翻訳します。

MyClass.method(my_object, "foo")

... ご覧のとおり、確かに 2 つの引数があります。呼び出し元の観点から見ると、最初の引数は暗黙的であるというだけです。

これは、ほとんどのメソッドが呼び出されたオブジェクトに対して何らかの処理を実行するため、メソッド内でそのオブジェクトを参照するための何らかの方法が必要であるためです。慣例により、この最初の引数はselfメソッド定義内で呼び出されます。

class MyNewClass:

    def method(self, arg):
        print(self)
        print(arg)

method("foo")のインスタンスを呼び出すとMyNewClass、期待どおりに動作します。

>>> my_new_object = MyNewClass()
>>> my_new_object.method("foo")
<__main__.MyNewClass object at 0x29045d0>
foo

時々(頻繁ではないが)、メソッドがバインドされているオブジェクトを気にしなくてよい場合があり、その場合は飾る組み込みメソッドstaticmethod()そう言う機能:

class MyOtherClass:

    @staticmethod
    def method(arg):
        print(arg)

...その場合、selfメソッド定義に引数を追加する必要はなく、引き続き機能します。

>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo

おすすめ記事