คลาส Python ต้องถูก instantiate (สร้างอินสแตนซ์) หรือเรียกก่อนที่คุณจะเข้าถึงเมธอดของมันได้ หากคุณลืมสร้างอินสแตนซ์ของคลาสและพยายามเข้าถึงเมธอดของคลาส คุณจะเจอข้อผิดพลาดที่กล่าวว่า "missing 1 required positional argument: 'self'"
ในคู่มือนี้ เราพูดถึงว่าข้อผิดพลาดนี้หมายถึงอะไรและทำไมมันจึงถูกยกขึ้น เราจะเดินทางผ่านตัวอย่างของข้อผิดพลาดนี้ในการทำงาน เพื่อช่วยคุณเรียนรู้วิธีแก้ไข
missing 1 required positional argument: 'self'
Positional arguments หมายถึงข้อมูลที่ส่งผ่านเข้าไปในฟังก์ชัน ในคลาส ทุกฟังก์ชันต้องได้รับค่า "self" ค่าของ "self" คล้ายกับ "this" ใน JavaScript "self" แทนข้อมูลที่จัดเก็บในออบเจ็กต์ของคลาส
เมื่อคุณเรียกเมธอดของคลาสโดยไม่ได้สร้างอินสแตนซ์ของคลาสนั้นก่อน คุณจะได้ข้อผิดพลาด นี่เป็นเพราะ "self" ไม่มีค่าจนกว่าจะมีการสร้างอินสแตนซ์ของออบเจ็กต์
ข้อผิดพลาดที่พบบ่อยที่สุดที่ทำให้เกิดข้อผิดพลาด "missing 1 required positional argument: 'self'" คือ:
- ลืมสร้างอินสแตนซ์ของคลาส
- ใช้ไวยากรณ์ผิดในการสร้างอินสแตนซ์ของคลาส
มาเดินทางผ่านแต่ละสาเหตุทีละอย่าง
สาเหตุ #1: ลืมสร้างอินสแตนซ์ของออบเจ็กต์ (Forgetting to Instantiate an Object)
ออบเจ็กต์ต้องถูกสร้างอินสแตนซ์ก่อนที่คุณจะเข้าถึงเมธอดในคลาสได้
กำหนดคลาสที่จัดเก็บข้อมูลเกี่ยวกับฮีโร่ (hero) ในเกมวิดีโอ:
class Hero: def __init__(self, name, player_type): self.name = name self.player_type = player_type
ต่อไป เราเพิ่มฟังก์ชันในคลาสของเรา ฟังก์ชันภายในคลาสเรียกว่าเมธอด (methods) เมธอดนี้พิมพ์ชื่อผู้เล่นและประเภทผู้เล่นของพวกเขา:
def show_player(self): print("Player Name: " + self.name) print("Player Type: " + self.player_type) ลองเข้าถึงคลาสของเราเพื่อที่เราจะสร้างผู้เล่น:
luke = Hero.show_player()
เราสร้างออบเจ็กต์ที่กำหนดให้กับตัวแปร "luke" ออบเจ็กต์นี้มาจากคลาส Hero เราเรียกเมธอด 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.show_player() ไม่ทำงานเพราะเรายังไม่ได้สร้าง Hero ที่ข้อมูลสามารถแสดงได้
เพื่อแก้ไขข้อผิดพลาดนี้ เราสร้างอินสแตนซ์ของออบเจ็กต์ก่อนที่เราจะเรียก show_player():
luke = Hero("Luke", "Mage") luke.show_player() รันโค้ดของเราอีกครั้ง:
Player Name: Luke Player Type: Mage
โค้ดของเรารันสำเร็จ! เราประกาศตัวแปรชื่อ "luke" ซึ่งจัดเก็บข้อมูลเกี่ยวกับผู้เล่นชื่อ Luke ประเภทผู้เล่นของ Luke คือ "Mage" ตอนนี้ที่เราสร้างอินสแตนซ์ของออบเจ็กต์นั้นแล้ว เราสามารถเรียกเมธอด show_player() ได้
สาเหตุ #2: การสร้างอินสแตนซ์ของคลาสอย่างผิดวิธี (Incorrectly Instantiating a Class)
ข้อผิดพลาด "missing 1 required positional argument: 'self'" อาจเกิดขึ้นเมื่อคุณสร้างอินสแตนซ์ของคลาสอย่างผิดวิธี พิจารณาโค้ดต่อไปนี้:
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'" ถูกยกขึ้นเมื่อคุณไม่สร้างอินสแตนซ์ของออบเจ็กต์ของคลาสก่อนเรียกเมธอดของคลาส ข้อผิดพลาดนี้ยังถูกยกขึ้นเมื่อคุณสร้างอินสแตนซ์ของคลาสอย่างผิดวิธี
เพื่อแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณสร้างอินสแตนซ์ของออบเจ็กต์ของคลาสก่อนที่คุณจะพยายามเข้าถึงเมธอดใดๆ ของคลาสนั้น จากนั้น ตรวจสอบให้แน่ใจว่าคุณใช้ไวยากรณ์ที่ถูกต้องในการสร้างอินสแตนซ์ของออบเจ็กต์
ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดทั่วไปนี้อย่างนักพัฒนา Python มืออาชีพแล้ว!