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

แก้ไข Python missing 1 required positional argument: 'self'

คลาส 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 มืออาชีพแล้ว!