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

Python ขาด 1 อาร์กิวเมนต์ตำแหน่งที่ต้องการ:'self' Solution

คลาส 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 ที่เชี่ยวชาญ!