TypeError : method ()는 1 개의 위치 인수를 취하지 만 2가 주어졌습니다


270

수업이 있다면 ...

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)

... 파이썬이 왜 하나만 주었을 때 두 가지 주장을했다고 말합니까?


그 메시지에는 원인이 없습니다. 여기서 특별한 이유는 모든 인스턴스 메소드가 사용자 정의에 의해 호출되는 첫 번째 인수를 기대하기 때문 self입니다. 따라서 선언 def method(arg):은 메소드에 대해 잘못된 것 def method(self, arg):입니다. 메소드 디스패치가 method(arg):두 매개 변수 를 호출 하고 일치 시키려고 self, arg하면 해당 오류가 발생합니다.
smci

답변:


367

파이썬에서 이것은 :

my_object.method("foo")

... 통역사가 장면 뒤에서 다음과 같이 해석하는 구문 설탕입니다 .

MyClass.method(my_object, "foo")

... 보시다시피, 실제로 두 가지 주장이 있습니다. 발신자의 관점에서 볼 때 첫 번째 주장은 암시 적입니다.

이것은 대부분의 메소드가 호출 된 오브젝트에 대해 일부 작업을 수행하기 때문에 메소드 내에서 해당 오브젝트를 참조 할 수있는 방법이 필요하기 때문입니다. 일반적으로이 첫 번째 인수는 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

99
간단히 말해서 : self메소드에 첫 번째 인수로 추가 하면 문제가 해결됩니다.
amoebe 2016 년

@amoebe-내 유형의 사람
Carlos

21

이 유형의 오류가 발생했을 때 고려해야 할 사항 :

이 오류 메시지가 표시되어이 게시물이 도움이되었다는 것을 알았습니다. 제 경우 __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은이 오타를 잡지 못했습니다. 메모장 ++도 (다른 편집자 / IDE의 경우도) 아닙니다.

물론 이것은 "매개 변수 없음"TypeError이며, 파이썬에서 객체 초기화 측면에서 하나를 기대할 때 "두 개를 얻는 것"과 크게 다르지 않습니다.

주제 해결 : 구문 상으로 올 바르면 오버로딩 이니셜 라이저가 사용되지만 그렇지 않으면 무시되고 내장 기능이 대신 사용됩니다. 객체는 이것을 예상 / 처리하지 않으며 오류가 발생합니다.

sytax 오류의 경우 : 수정은 간단합니다. 사용자 정의 init 문을 편집하십시오.

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

1
더 없습니다 SyntaxError여기. 코드는 구문 상 정확합니다. 단지 ___init__특별한 메소드 대신 아무도 호출하지 않는 이라는 메소드를 올바르게 정의합니다 __init__. 따라서 감지 할 오류가 없기 때문에 오류가 감지되지 않습니다.
abarnert 2016 년

14

간단히 말해서.

파이썬에서는 self클래스의 모든 정의 된 메소드에 인수를 첫 번째 인수로 추가해야합니다 .

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

그런 다음 직감에 따라 방법을 사용할 수 있습니다.

>>> my_object = MyClass()
>>> my_object.method("foo")
foo

이것은 당신의 문제를 해결해야합니다 :)

이해를 돕기 위해이 질문에 대한 답을 읽을 수도 있습니다. 자기의 목적은 무엇입니까?


2
이 답변에 어떤 문제가 있습니까? 누군가 왜 그녀에게 부정적인 지적을 했습니까? 결국, 그것은 질문에 대한 답변이며 다른 답변에 비해 그 단순성으로 구별되며, 답변을 찾는 일부 사람들에게 중요 할 수 있습니다. 그렇지 않습니까?
simhumileco 21

10

파이썬을 처음 접했을 때 파이썬의 **기능을 잘못 사용했을 때이 문제가 발생했습니다 . 어딘가 에서이 정의를 호출하려고합니다.

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)

1
JavaScript에서 나오면 목록이나 사전을 인수로 전달할 수있을 것으로 기대합니다. 그러나 그것은 파이썬이 작동하는 방식이 아닌 것 같습니다 : * 또는 **로 목록을 구조화해야합니다. 후자는 키워드 인수 목록입니다.
작은 뇌

1
@LittleBrain : 예 함수 내에서 목록 (/ dict)으로 처리되도록하려면 목록 (또는 dict)을 전달할 수 있습니다. 그러나 함수에서 개별 값의 압축을 풀고 args (/ kwargs)와 일치 시키려면 *args(/ **kwargs) 구문 이 필요 합니다.
smci

9

매개 변수 __init__()또는 다른 방법으로 찾을 매개 변수를 지정하지 않으면 발생합니다 .

예를 들면 다음과 같습니다.

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이 주어졌습니다

우리는 어떻게이 일을 제거 할 수 있습니까?

그냥 무엇을, 매개 변수를 전달할 __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))

1

실제로 클래스를 작성해야합니다.

class accum:
    def __init__(self):
        self.acc = 0
    def accumulator(self, var2add, end):
        if not end:
            self.acc+=var2add
    return self.acc

0

제 경우에는 추가하는 것을 잊었습니다 ()

나는 이런 방법으로 전화했다

obj = className.myMethod

하지만 이렇게해야합니다

obj = className.myMethod()

-1

패스 cls에 매개 변수를 @classmethod이 문제를 해결하려면.

@classmethod
def test(cls):
    return ''
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.