ค่า "ตัวเอง" จะใช้ได้เฉพาะในเมธอดเมื่อมีการเรียกใช้และระบุฟังก์ชันเท่านั้น
คุณไม่สามารถเข้าถึง "ตนเอง" ในอาร์กิวเมนต์ที่ระบุในเมธอด หรือภายในฟังก์ชันโดยไม่ระบุ "ตนเอง" เป็นอาร์กิวเมนต์ มิฉะนั้น คุณจะเห็นข้อผิดพลาด "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 อย่างนักพัฒนามืออาชีพแล้ว!