"self" 값은 함수가 호출되고 지정될 때 메서드 내에서만 사용할 수 있습니다.
메서드에 지정된 인수에서 또는 "self"를 인수로 지정하지 않고 함수 내부에서 "self"에 액세스할 수 없습니다. 그렇지 않으면 "NameError:name 'self' is not defined" 오류가 표시됩니다.
이 가이드에서는 이 오류의 의미와 발생 이유에 대해 설명합니다. 코드에서 이 오류를 해결하는 방법을 알아내는 데 도움이 되는 몇 가지 코드 스니펫을 살펴봅니다.
NameError:'self' 이름이 정의되지 않았습니다.
"self" 변수는 클래스 내부의 객체에 대한 정보를 보유합니다. 개체에 할당된 모든 값은 "self" 변수에서 사용할 수 있습니다.
"self"를 메서드에서 사용하려면 인수로 전달해야 합니다. "self" 변수는 메서드 내에서만 액세스할 수 있으므로 메서드의 다른 인수에서 사용할 수 없습니다.
다음과 같은 경우 "NameError:name 'self'가 정의되지 않았습니다" 오류가 발생합니다.
- "self"를 인수로 지정하지 마세요.
- 다른 인수에서 인수로 "self" 사용
이러한 각 시나리오를 하나씩 살펴보겠습니다.
시나리오 #1:"self"가 인수로 나열되지 않음
"self"는 메서드에서 액세스할 수 있도록 인수로 나열되어야 합니다. "self"는 전역 변수가 아닙니다. 클래스 내에서 로컬입니다.
참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.
부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.
수업에서 영화에 대한 정보를 담고 있는 프로그램을 작성하십시오. 영화에 대한 값을 보유하는 생성자로 클래스를 정의하는 것으로 시작합니다.
class Movie: def __init__(self, name, year_released): self.name = name self.year_released = year_released
우리 클래스는 영화 이름과 개봉 연도의 두 가지 값을 가질 수 있습니다. 다음으로 "year_released" 값을 변경할 수 있는 메서드를 선언합니다.
def change_year(year_released): self.year_released = year_released print("{} was released in {}.".format(self.name, self.year_released))
코드를 테스트하기 위해 클래스의 객체를 생성합니다. 이 개체는 1996년에 개봉된 영화 해피 길모어를 나타냅니다.
happy_gilmore = Movie("Happy Gilmore") happy_gilmore.change_year(1996)
change_year()
를 호출했습니다. 영화가 출시된 연도를 1996년으로 설정할 수 있도록 객체에 메서드를 지정합니다. 코드를 실행하고 작동하는지 확인합니다.
Traceback (most recent call last): File "main.py", line 11, in <module> happy_gilmore.change_year() File "main.py", line 7, in change_year self.year_released = year_released NameError: name 'self' is not defined
코드가 오류를 반환합니다.
이 오류는 "self"를 메서드에 대한 인수로 전달하지 않았기 때문에 발생합니다. change_year()
의 첫 번째 인수로 "self"를 추가하여 이 오류를 수정합니다. 방법:
def change_year(self, year_released): self.year_released = year_released print("{} was released in {}.".format(self.name, self.year_released))
코드를 다시 실행하십시오.
Happy Gilmore was released in 1996.
코드가 성공적으로 실행되었습니다!
시나리오 #2:"self"를 다른 인수에서 인수로 사용
"self"는 함수가 호출될 때 평가됩니다. 이것은 함수 호출에 지정된 인수 목록에서 "self"를 참조하는 인수를 가질 수 없음을 의미합니다.
다른 출시 연도가 지정되지 않은 경우 영화 연도가 변경되지 않았다는 메시지가 콘솔에 인쇄되도록 "year_released" 메서드를 업데이트합니다.
코드에서 기본 인수를 설정하여 이를 수행할 수 있습니다.
def change_year(self, year_released=self.year_released): if year_released != self.year_released: self.year_released = year_released print("{} was released in {}.".format(self.name, self.year_released)) else: print("This movie has not been changed.") print(year_released)
"year_released"는 이제 "self.year_released"의 기본값을 갖습니다. 즉, 연도를 변경해야 하는 값을 지정하지 않으면 기본값이 설정됩니다. 값을 지정하면 기본값 대신 지정한 값이 사용됩니다.
지정한 값이 "self.year_released"의 값과 같지 않으면 "self.year_released"의 값이 변경됩니다. 그렇지 않으면 사용자에게 영화가 변경되지 않았다는 메시지가 콘솔에 인쇄됩니다.
if
뒤에 문이 평가되면 "year_released" 값이 콘솔에 인쇄됩니다.
코드를 실행해 보겠습니다.
Traceback (most recent call last): File "main.py", line 1, in <module> class Movie: File "main.py", line 6, in Movie def change_year(self, year_released=self.year_released): NameError: name 'self' is not defined
코드에서 오류가 발생합니다. 이는 인수 목록의 다른 인수에서 "self"를 사용하려고 했기 때문입니다.
인수 목록 대신 함수 내에서 "year_released" 변수 값을 "self.year_released"로 설정하여 이 오류를 수정할 수 있습니다.
def change_year(self, year_released=None): if year_released != self.year_released: self.year_released = year_released print("{} was released in {}.".format(self.name, self.year_released)) else: year_released = self.year_released print("This movie has not been changed.") print(year_released)
이 코드에서는 함수 호출에서 "year_released" 값을 지정하지 않으면 "year_released"를 "self.year_released"와 동일하게 설정합니다.
코드를 테스트하기 위해 새 Movie 개체를 만들어 보겠습니다.
happy_gilmore = Movie("Happy Gilmore", 1995) happy_gilmore.change_year(1996)
Happy Gilmore가 출시된 연도를 1995로 잘못 지정했습니다. change_year()
를 사용하여 변경해야 합니다. 방법. 코드는 다음을 반환합니다.
Happy Gilmore was released in 1996. 1996
코드가 성공적으로 실행되었습니다. "year_released" 값이 이미 change_year()
에서 지정한 값과 동일한 경우 코드를 테스트해 보겠습니다. 방법:
happy_gilmore = Movie("Happy Gilmore", 1996) happy_gilmore.change_year(1996)
코드 반환:
This movie has not been changed. 1996
우리 코드는 else
를 실행합니다. 코드에 문을 추가한 다음 영화가 변경되지 않았음을 알려줍니다.
결론
"NameError:name 'self' is not defined" 오류는 "self"를 위치 인수로 지정하는 것을 잊거나 인수 목록의 다른 인수에 "self"를 사용할 때 발생합니다.
"self"를 사용하는 함수의 모든 메서드가 인수 목록에 "self"를 포함하도록 하여 이 오류를 해결합니다. 그래도 작동하지 않으면 인수 목록의 인수가 기본값에 대해 "self"에 의존하지 않는지 확인하십시오.
이제 전문 개발자처럼 이 Python 오류를 해결할 준비가 되었습니다!