Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python NameError:ไม่ได้กำหนดชื่อ 'ตัวเอง' ไว้ Solution

ค่า "ตัวเอง" จะใช้ได้เฉพาะในเมธอดเมื่อมีการเรียกใช้และระบุฟังก์ชันเท่านั้น

คุณไม่สามารถเข้าถึง "ตนเอง" ในอาร์กิวเมนต์ที่ระบุในเมธอด หรือภายในฟังก์ชันโดยไม่ระบุ "ตนเอง" เป็นอาร์กิวเมนต์ มิฉะนั้น คุณจะเห็นข้อผิดพลาด "NameError:name 'self' is not suitable"

ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้และสาเหตุที่ทำให้เกิดข้อผิดพลาดนี้ขึ้น เราอธิบายข้อมูลโค้ดบางส่วนเพื่อช่วยให้คุณทราบวิธีแก้ไขข้อผิดพลาดนี้ในโค้ดของคุณ

NameError:ไม่ได้กำหนดชื่อ 'ตัวเอง'

ตัวแปร "ตนเอง" เก็บข้อมูลเกี่ยวกับวัตถุภายในชั้นเรียน ค่าทั้งหมดที่กำหนดให้กับวัตถุมีอยู่ในตัวแปร "ตนเอง"

“ตัวเอง” ต้องถูกส่งผ่านเป็นอาร์กิวเมนต์หากคุณต้องการใช้ในเมธอด ไม่สามารถใช้ตัวแปร "ตนเอง" ในอาร์กิวเมนต์อื่นในเมธอดได้ เนื่องจากสามารถเข้าถึงได้จากภายในเมธอดเท่านั้น

คุณพบข้อผิดพลาด "NameError:name 'self' is not suitable" หากคุณ:

  • อย่าระบุว่าตัวเองเป็นอาร์กิวเมนต์
  • ใช้ “ตัวเอง” เป็นอาร์กิวเมนต์ในอาร์กิวเมนต์อื่น

มาดูแต่ละสถานการณ์เหล่านี้กันทีละคน

สถานการณ์ #1:“ตัวเอง” ไม่อยู่ในรายการอาร์กิวเมนต์

“ตัวเอง” ต้องแสดงรายการเป็นอาร์กิวเมนต์เพื่อให้สามารถเข้าถึงได้ในวิธีการ “ตัวเอง” ไม่ใช่ตัวแปรระดับโลก เป็นท้องถิ่นภายในชั้นเรียน

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

เขียนโปรแกรมที่เก็บข้อมูลเกี่ยวกับภาพยนตร์ในชั้นเรียน เราเริ่มต้นด้วยการกำหนดคลาสของเราด้วยคอนสตรัคเตอร์ที่มีค่าเกี่ยวกับภาพยนตร์ของเรา:

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))

เพื่อทดสอบรหัสของเรา เราสร้างวัตถุของชั้นเรียนของเรา วัตถุนี้แสดงถึงภาพยนตร์ Happy Gilmore ที่ออกฉายในปี 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() วิธีการ:

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:การใช้ “ตัวเอง” เป็นอาร์กิวเมนต์ในอาร์กิวเมนต์อื่น

“ตนเอง” จะถูกประเมินเมื่อมีการเรียกฟังก์ชัน ซึ่งหมายความว่าคุณไม่สามารถมีอาร์กิวเมนต์ที่อ้างถึง "ตัวเอง" ในรายการอาร์กิวเมนต์ที่ระบุในการเรียกใช้ฟังก์ชัน

อัปเดตวิธีการ “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

รหัสของเราทำให้เกิดข้อผิดพลาด นี่เป็นเพราะเราได้พยายามใช้ "ตัวเอง" ในการโต้แย้งอื่นในรายการข้อโต้แย้งของเรา

เราสามารถแก้ไขข้อผิดพลาดนี้ได้โดยการตั้งค่าตัวแปร “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” ให้เท่ากับ “self.year_released” หากเราไม่ได้ระบุค่าสำหรับ “year_released” ในการเรียกใช้ฟังก์ชันของเรา

มาสร้างวัตถุภาพยนตร์ใหม่เพื่อทดสอบโค้ดของเรา:

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:ชื่อ 'ตัวเอง' ไม่ได้ถูกกำหนด" จะเกิดขึ้นเมื่อคุณลืมระบุ "ตนเอง" เป็นอาร์กิวเมนต์ตำแหน่งหรือเมื่อคุณใช้ "ตัวเอง" กับอาร์กิวเมนต์อื่นในรายการอาร์กิวเมนต์

คุณแก้ไขข้อผิดพลาดนี้โดยตรวจสอบให้แน่ใจว่าวิธีการทั้งหมดในฟังก์ชันที่ใช้ "ตนเอง" รวม "ตนเอง" ไว้ในรายการอาร์กิวเมนต์ หากไม่ได้ผล ตรวจสอบให้แน่ใจว่าไม่มีอาร์กิวเมนต์ในรายการอาร์กิวเมนต์ที่ขึ้นอยู่กับ "ตัวเอง" สำหรับค่าเริ่มต้น

ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดของ Python อย่างนักพัฒนามืออาชีพแล้ว!