คลาส Python จำเป็นต้องสร้างอินสแตนซ์หรือเรียกใช้ก่อนที่คุณจะสามารถเข้าถึงวิธีการได้ หากคุณลืมสร้างอินสแตนซ์อ็อบเจ็กต์ของคลาสและพยายามเข้าถึงเมธอดของคลาส คุณพบข้อผิดพลาดที่ระบุว่า "ขาดอาร์กิวเมนต์ตำแหน่งที่ต้องการ 1 รายการ:'ตนเอง'"
ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้และสาเหตุที่ทำให้เกิดข้อผิดพลาดนี้ขึ้น เราอธิบายตัวอย่างของข้อผิดพลาดนี้ในการดำเนินการเพื่อช่วยให้คุณเรียนรู้วิธีแก้ไข
ขาด 1 อาร์กิวเมนต์ตำแหน่งที่ต้องการ:'ตัวเอง'
อาร์กิวเมนต์ตำแหน่งอ้างถึงข้อมูลที่ส่งผ่านไปยังฟังก์ชัน ในคลาส ทุกฟังก์ชันจะต้องได้รับค่า "ตัวเอง" คุณค่าของ “ตนเอง” นั้นคล้ายกับ “สิ่งนี้” ในจาวาสคริปต์ “ตัวเอง” หมายถึงข้อมูลที่เก็บไว้ในวัตถุของคลาส
เมื่อคุณเรียกใช้เมธอดของคลาสโดยไม่ได้สร้างอินสแตนซ์อ็อบเจ็กต์ของคลาสนั้นก่อน คุณจะได้รับข้อผิดพลาด นี่เป็นเพราะว่า "ตัวเอง" ไม่มีค่าจนกว่าวัตถุจะได้รับการยกตัวอย่าง
ข้อผิดพลาดที่พบบ่อยที่สุดที่ทำให้เกิดข้อผิดพลาด "ขาดอาร์กิวเมนต์ตำแหน่งที่ต้องการ 1 รายการ:'ตนเอง'" ได้แก่:
- ลืมยกตัวอย่างวัตถุของคลาส
- การใช้ไวยากรณ์ที่ไม่ถูกต้องเพื่อสร้างอินสแตนซ์ของคลาส
มาดูสาเหตุแต่ละข้อกัน
สาเหตุ #1:การลืมยกตัวอย่างวัตถุ
อ็อบเจ็กต์ต้องสร้างอินสแตนซ์ก่อนจึงจะสามารถเข้าถึงเมธอดในคลาสได้
กำหนดคลาสที่เก็บข้อมูลเกี่ยวกับฮีโร่ในวิดีโอเกม:
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
class Hero: def __init__(self, name, player_type): self.name = name self.player_type = player_type
ต่อไป เราเพิ่มฟังก์ชันในชั้นเรียนของเรา ฟังก์ชันภายในคลาสเรียกว่าเมธอด วิธีนี้จะพิมพ์ชื่อผู้เล่นและประเภทผู้เล่น:
def show_player(self): print("Player Name: " + self.name) print("Player Type: " + self.player_type)
พยายามเข้าคลาสของเราเพื่อสร้างผู้เล่น:
luke = Hero.show_player()
เราได้สร้างวัตถุที่กำหนดให้กับตัวแปร "ลุค" วัตถุนี้มาจากคลาสฮีโร่ เราเรียก 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.show_player()
ใช้งานไม่ได้เพราะเรายังไม่ได้สร้างฮีโร่ที่สามารถแสดงข้อมูลได้
เพื่อแก้ไขข้อผิดพลาดนี้ ก่อนอื่นเราต้องสร้างอินสแตนซ์ของวัตถุก่อนที่เราจะเรียก show_player()
:
luke = Hero("Luke", "Mage") luke.show_player()
เรียกใช้รหัสของเราอีกครั้ง:
Player Name: Luke Player Type: Mage
รหัสของเราทำงานสำเร็จ! ขั้นแรกเราได้ประกาศตัวแปรที่เรียกว่า "ลุค" ซึ่งเก็บข้อมูลเกี่ยวกับผู้เล่นที่ชื่อลุค ประเภทผู้เล่นของลุคคือ “ผู้วิเศษ” ตอนนี้เราได้ยกตัวอย่างวัตถุนั้นแล้ว เราสามารถเรียก show_player()
วิธีการ
สาเหตุ #2:การสร้างอินสแตนซ์ของคลาสอย่างไม่ถูกต้อง
ข้อผิดพลาด "ขาด 1 อาร์กิวเมนต์ตำแหน่งที่ต้องการ:'ตัวเอง'" สามารถเกิดขึ้นได้เมื่อคุณสร้างอินสแตนซ์ของคลาสอย่างไม่ถูกต้อง พิจารณารหัสต่อไปนี้:
luke = Hero luke.show_player()
แม้ว่าโค้ดนี้จะคล้ายกับโซลูชันของเราจากตัวอย่างที่แล้ว แต่ก็ไม่ถูกต้อง เนื่องจากเรายังไม่ได้ใส่วงเล็บหลังคำว่า Hero เมื่อไม่มีวงเล็บเหล่านี้ โปรแกรมของเราไม่ทราบว่าเราต้องการสร้างอินสแตนซ์ของชั้นเรียน
แก้ปัญหานี้โดยใส่วงเล็บหลัง Hero และระบุอาร์กิวเมนต์ที่ต้องการ ได้แก่ “name” และ “player_type”:
luke = Hero("Luke", "Mage") luke.show_player()
ตอนนี้รหัสของเราทำงานสำเร็จและส่งคืนข้อมูลเกี่ยวกับผู้เล่นของเรา:
Player Name: Luke Player Type: Mage
บทสรุป
ข้อผิดพลาด "ขาด 1 อาร์กิวเมนต์ตำแหน่งที่ต้องการ:'ตัวเอง'" เกิดขึ้นเมื่อคุณไม่ยกตัวอย่างวัตถุของคลาสก่อนที่จะเรียกใช้เมธอดของคลาส ข้อผิดพลาดนี้ยังเกิดขึ้นเมื่อคุณสร้างอินสแตนซ์ของคลาสอย่างไม่ถูกต้อง
ในการแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณได้ยกตัวอย่างวัตถุของคลาสก่อนที่คุณพยายามเข้าถึงวิธีการของคลาสนั้น จากนั้น ตรวจสอบให้แน่ใจว่าคุณใช้ไวยากรณ์ที่ถูกต้องเพื่อสร้างอินสแตนซ์ของวัตถุ
ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดทั่วไปนี้แล้ว เช่นเดียวกับนักพัฒนา Python ที่เชี่ยวชาญ!