[python] 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)

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



답변

파이썬에서 이것은 :

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


답변

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

이 오류 메시지가 표시되어이 게시물이 도움이되었다는 것을 알았습니다. 제 경우 __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


답변

간단히 말해서.

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

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

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

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

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

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


답변

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

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)


답변

매개 변수 __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))


답변

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

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


답변

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

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

obj = className.myMethod

하지만 이렇게해야합니다

obj = className.myMethod()