web-dev-qa-db-ja.com

TypeError:method()は1つの位置引数を取りますが、2つが指定されました

私はクラスがありますか...

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が2つの引数を与えたのですか。

161
Zero Piraeus

Pythonでは、これは

my_object.method("foo")

...は 構文糖 です。これは、インタプリタが舞台裏で次のように変換します。

MyClass.method(my_object, "foo")

お分かりのように、これは2つの引数を持っています - 呼び出し側から見れば、最初の引数が暗黙的であるということだけです。

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

class MyNewClass:

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

MyNewClassのインスタンスでmethod("foo")を呼び出しても、期待通りに動作します。

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

ときどき(しかし頻繁にではありません)、あなたはあなたのメソッドがバインドされているオブジェクトについて本当に しないで 気にします、そしてその状況ではあなたは decorate 組み込みメソッド staticmethod() function)そう言うために:

class MyOtherClass:

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

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

>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo
234
Zero Piraeus

この種のエラーが発生した場合に考慮すべきことが他にあります。

私はこのエラーメッセージに遭遇していました、そして、この記事は役に立ちました。私の場合は、オブジェクトの継承がある init ()をオーバーライドしていました。

継承された例はかなり長いので、継承を使用しないもっと単純な例にスキップします。

class MyBadInitClass:
    def ___init__(self, name):
        self.name = name

    def name_foo(self, arg):
        print(self)
        print(arg)
        print("My name is", self.name)


class MyNewClass:
    def new_foo(self, arg):
        print(self)
        print(arg)


my_new_object = MyNewClass()
my_new_object.new_foo("NewFoo")
my_bad_init_object = MyBadInitClass(name="Test Name")
my_bad_init_object.name_foo("name foo")

結果は次のとおりです。

<__main__.MyNewClass object at 0x033C48D0>
NewFoo
Traceback (most recent call last):
  File "C:/Users/Orange/PycharmProjects/Chapter9/bad_init_example.py", line 41, in <module>
    my_bad_init_object = MyBadInitClass(name="Test Name")
TypeError: object() takes no parameters

PyCharmはこのタイプミスを見つけませんでした。 Notepad ++(他のエディタ/ IDEの人たちも)はそうではありませんでした。

確かに、これは「引数を取らない」TypeErrorです。Pythonでのオブジェクトの初期化に関しては、期待される場合の「取得された2」と大差ありません。

トピックへの対処:構文的に正しい場合はオーバーロードイニシャライザが使用されますが、正しくない場合は無視され、代わりに組み込みコマンドが使用されます。オブジェクトはこれを期待/処理せず、エラーがスローされます。

Sytaxエラーの場合:修正は簡単です。カスタムinitステートメントを編集するだけです。

def __init__(self, name):
    self.name = name
10
Jonru2016

init ()や他の探しているパラメータのnoを指定しなかった場合に起こります。

例えば

class Dog:
    def __init__(self):
        print("IN INIT METHOD")

    def __unicode__(self,):
        print("IN UNICODE METHOD")

    def __str__(self):
        print("IN STR METHOD")

obj=Dog("JIMMY",1,2,3,"WOOF")

あなたが上記のプログラムを実行するとき、それはあなたにそのようなエラーを与えます TypeError:__init __()は1つの位置引数を取りますが、6つは与えられました

どのように我々はこのことを取り除くことができますか?

パラメータを渡すだけで、what init ()メソッドが探します

class Dog:
    def __init__(self, dogname, dob_d, dob_m, dob_y, dogSpeakText):
        self.name_of_dog = dogname
        self.date_of_birth = dob_d
        self.month_of_birth = dob_m
        self.year_of_birth = dob_y
        self.sound_it_make = dogSpeakText

    def __unicode__(self, ):
        print("IN UNICODE METHOD")

    def __str__(self):
        print("IN STR METHOD")


obj = Dog("JIMMY", 1, 2, 3, "WOOF")
print(id(obj))
3
Trinadh Koya

Pythonの初心者で、Pythonの**機能を間違った方法で使用していたときにこの問題が発生しました。どこかからこの定義を呼び出そうとしています:

def create_properties_frame(self, parent, **kwargs):

二重星のない通話を使用すると、問題が発生していました。

self.create_properties_frame(frame, kw_gsp)

TypeError:create_properties_frame()は2つの位置引数を取りますが、3つが指定されました

解決策は、引数に**を追加することです。

self.create_properties_frame(frame, **kw_gsp)
2