1. ホーム
  2. python

[解決済み】TypeError: method()は1つの位置引数を取るが、2つが与えられている

2022-01-27 07:11:21

質問

クラスがあれば...

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)

...なぜPythonは、私が1つしか引数を与えていないのに、2つの引数を与えたと言うのでしょうか?

どのように解決するのですか?

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)

...この場合、"C "マークは必要ありません。 self という引数をメソッド定義に追加しても動作します。

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