Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python NameError:'self' 이름이 정의되지 않았습니다.

"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 오류를 해결할 준비가 되었습니다!