Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 'missing 1 required positional argument: self' 오류 원인과 해결 방법

파이썬(Python)에서 클래스의 메서드에 접근하려면 먼저 클래스를 인스턴스화해야 합니다. 클래스 객체를 생성하지 않은 상태에서 클래스 메서드를 호출하면 "missing 1 required positional argument: 'self'"라는 오류가 발생합니다.

'missing 1 required positional argument: self' 오류란?

위치 인수(positional argument)는 함수에 전달되는 데이터를 의미합니다. 클래스 내부의 모든 함수에는 반드시 "self" 값이 전달되어야 합니다. "self"는 자바스크립트(JavaScript)의 "this"와 유사한 개념으로, 클래스 객체에 저장된 데이터를 나타냅니다.

객체를 먼저 인스턴스화하지 않고 클래스 메서드를 호출하면 오류가 발생합니다. 이는 객체가 인스턴스화되기 전까지는 "self"에 어떠한 값도 존재하지 않기 때문입니다.

이 오류를 유발하는 가장 흔한 실수는 다음 두 가지입니다.

  • 클래스 객체 인스턴스화를 잊은 경우
  • 잘못된 문법으로 클래스를 인스턴스화한 경우

지금부터 각 원인을 하나씩 자세히 살펴보겠습니다.

원인 1: 객체 인스턴스화 누락

클래스의 메서드에 접근하려면 반드시 객체를 먼저 인스턴스화해야 합니다.

게임 속 영웅(hero) 정보를 저장하는 클래스를 정의해 보겠습니다.

class Hero:
    def __init__(self, name, player_type):
        self.name = name
        self.player_type = player_type

다음으로 클래스에 메서드를 추가합니다. 클래스 내부의 함수를 메서드(method)라고 부르며, 아래 메서드는 플레이어의 이름과 플레이어 타입을 출력합니다.

def show_player(self):
    print("Player Name: " + self.name)
    print("Player Type: " + self.player_type)

플레이어를 생성하기 위해 클래스에 접근해 보겠습니다.

luke = Hero.show_player()

Hero 클래스로부터 객체를 만들어 변수 "luke"에 할당하고, show_player() 메서드를 호출해 플레이어 정보를 출력하려고 했습니다.

코드를 전체 실행하면 다음과 같은 결과가 나타납니다.

Traceback (most recent call last):
  File "main.py", line 10, in <module>
    luke = Hero.show_player()
TypeError: show_player() missing 1 required positional argument: 'self'

코드 실행이 실패했습니다. Hero 객체를 인스턴스화하지 않았기 때문입니다. 정보를 표시할 Hero 객체가 존재하지 않으므로 Hero.show_player()는 정상적으로 동작할 수 없습니다.

이 오류를 해결하려면 show_player()를 호출하기 전에 먼저 객체를 인스턴스화해야 합니다.

luke = Hero("Luke", "Mage")
luke.show_player()

코드를 다시 실행해 보겠습니다.

Player Name: Luke
Player Type: Mage

이번에는 코드가 성공적으로 실행됩니다! 변수 "luke"에 플레이어 Luke의 정보가 저장되었고, Luke의 플레이어 타입은 "Mage"입니다. 객체를 인스턴스화했기 때문에 이제 show_player() 메서드를 정상적으로 호출할 수 있습니다.

원인 2: 잘못된 방식으로 클래스 인스턴스화

클래스를 잘못된 방식으로 인스턴스화해도 동일한 오류가 발생할 수 있습니다. 다음 코드를 살펴보겠습니다.

luke = Hero
luke.show_player()

앞선 예시의 해결책과 비슷해 보이지만, 이 코드는 잘못되었습니다. Hero 뒤에 괄호를 붙이지 않았기 때문입니다. 괄호가 없으면 프로그램은 클래스를 인스턴스화하려는 의도를 인식하지 못합니다.

Hero 뒤에 괄호를 추가하고 필수 인수인 "name"과 "player_type"을 지정하면 문제가 해결됩니다.

luke = Hero("Luke", "Mage")
luke.show_player()

이제 코드가 성공적으로 실행되며 플레이어 정보를 출력합니다.

Player Name: Luke
Player Type: Mage

마무리

"missing 1 required positional argument: 'self'" 오류는 클래스 메서드를 호출하기 전에 객체를 인스턴스화하지 않았을 때 발생하며, 클래스를 잘못된 문법으로 인스턴스화한 경우에도 나타납니다.

이 오류를 해결하려면 클래스 메서드에 접근하기 전에 반드시 객체를 먼저 인스턴스화해야 하며, 인스턴스화 시 올바른 문법을 사용했는지 확인해야 합니다.

이제 여러분도 숙련된 파이썬 개발자처럼 이 흔한 오류를 손쉽게 해결할 수 있을 것입니다!