본문 바로가기
Python/Python FAQ

Python "TypeError: method()는 1개의 위치 인수를 필요로 하지만 2개가 제공되었습니다" 하지만 저는 하나만 전달했습니다., "TypeError: method() takes 1 positional argument but 2 were given" but I only passed one

by 베타코드 2023. 10. 25.
반응형

질문


만약 내가 클래스를 가지고 있다면...

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이 나에게 두 개의 인자를 주었다고 말하는 이유는 무엇인가요? 하나만 주었는데요?


답변


파이썬에서는 다음과 같습니다:

my_object.method("foo")

...는 인터프리터가 자동으로 다음과 같이 번역하는 문법적 설탕입니다:

MyClass.method(my_object, "foo")

...이렇게 보면, 실제로는 두 개의 인수가 있는 것을 알 수 있습니다 - 호출하는 측면에서 첫 번째 인수는 암시적입니다.

대부분의 메소드는 호출된 객체와 함께 작업을 수행하기 때문에, 메소드 내에서 해당 객체를 참조할 수 있는 방법이 필요합니다. 관례적으로, 이 첫 번째 인수는 메소드 정의 내에서 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

가끔씩 (하지만 자주는 아님) 메소드가 바인딩된 객체에 관심이 없을 수 있습니다. 이 경우, 내장된 데코레이터 함수인 staticmethod()를 사용하여 메소드를 꾸밀 수 있습니다:

class MyOtherClass:

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

...이 경우, 메소드 정의에 self 인수를 추가할 필요가 없으며 여전히 작동합니다:

>>> my_other_object = MyOtherClass()
>>> my_other_object.method("foo")
foo
반응형

댓글