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

Python AttributeError: คู่มือวิธีการแก้ไข

แอตทริบิวต์ (Attributes) คือค่าหรือฟังก์ชันที่เกี่ยวข้องกับออบเจ็กต์ ประเภทข้อมูล หรือคลาส หากคุณเรียกแอตทริบิวต์บนค่าที่ประเภทข้อมูลหรือคลาสของมันไม่รองรับแอตทริบิวต์นั้น คุณจะพบ AttributeError

คู่มือนี้อภิปรายว่า AttributeError คืออะไรและหมายถึงอะไร เราจะเดินทางผ่านตัวอย่างของ AttributeError เพื่อให้คุณเรียนรู้วิธีแก้ไขในโค้ดของคุณ

Python AttributeError คืออะไร? (What is a Python AttributeError?)

Python AttributeError ถูกโยนออกมาเมื่อคุณพยายามเรียกแอตทริบิวต์ของออบเจ็กต์ที่ประเภทของมันไม่รองรับเมธอดนั้น ตัวอย่างเช่น การพยายามใช้เมธอด Python append() บนสตริงจะคืนค่า AttributeError เนื่องจากสตริงไม่รองรับ append()

ในคลาส Python คุณสามารถกำหนดเมธอดและค่าที่ถูกแบ่งปันโดยออบเจ็กต์ของคลาสนั้น นี่คือเหตุผลที่บางคนคิดว่าคลาสเป็นแผนผังสำหรับออบเจ็กต์

การเรียกเมธอดหรือคลาสเป็นอีกวิธีหนึ่งในการพูดว่าคุณกำลังอ้างอิงแอตทริบิวต์ของคลาสนั้น วิธีหนึ่งในการคิดถึงแอตทริบิวต์คือเหมือนแอตทริบิวต์ทางกายภาพของบุคคล บางคนมีตาสีฟ้า บางคนมีผมสีชมพู สิ่งเหล่านี้ทั้งหมดคือแอตทริบิวต์

ในคลาส Python แอตทริบิวต์อาจเป็น "eye_color" แอตทริบิวต์นี้อาจกำหนดสีของตาบุคคล แอตทริบิวต์อาจเป็นฟังก์ชันด้วย ฟังก์ชันที่ชื่อ changeEyeColor() อาจเปลี่ยนค่าของ "eye_color"

ประเภทข้อมูลมีแอตทริบิวต์ ตัวอย่างเช่น คุณสามารถใช้เมธอด Python join() เพื่อแปลงสตริงเป็นรายการ ออบเจ็กต์สตริงรองรับเมธอด join()

หากคุณพยายามอ้างอิงฟังก์ชันหรือค่าที่ไม่เกี่ยวข้องกับออบเจ็กต์คลาสหรือประเภทข้อมูล คุณจะพบ AttributeError

ตัวอย่าง Attribute Error ใน Python (Attribute Error Python Example)

มาเขียนโปรแกรมที่รวมสองรายการรองเท้า ร้านรองเท้าสองร้านกำลังผ่านการรวมกันและต้องการสร้างรายการของรองเท้าที่ไม่ซ้ำกันทั้งหมดที่พวกเขาขาย

เริ่มต้นด้วยการกำหนดเซ็ตของ Python ที่มีรองเท้าจากร้านหนึ่ง คือ Harrisons Shoes:

harrisons_shoes = {"Nike Air Force 1 07", "Nike Air Max Plus", "Adidas Gazelle"}

เราใช้วงเล็บปีกกาเพื่อกำหนดเซ็ตของเรา ต่อไป มากำหนดเซ็ตที่มีชื่อรองเท้าที่เสนอโดยร้านที่กำลังรวมกับ Harrisons ร้านรองเท้านี้ชื่อ Shoe Emporium:

shoe_emporium = {"Adidas Samba", "Adidas Superstar", "Nike Air Max Plus"}

เนื่องจากสองคอลเลกชันนี้เป็นเซ็ต พวกเขาจึงสามารถจัดเก็บค่าที่ไม่ซ้ำกันเท่านั้น นั่นหมายความว่าเมื่อเรารวมพวกเขาเข้าด้วยกัน เราจะได้เซ็ตที่ไม่มีค่าซ้ำ

เพื่อรวมเซ็ตของเราสองอัน เราจะใช้ฟังก์ชันในตัวที่ชื่อ extend():

harrisons_shoes.extend(shoe_emporium)
print(harrisons_shoes)

เมธอด extend() เพิ่มรองเท้าทั้งหมดจากเซ็ต "shoe_emporium" ไปยังเซ็ต "harrisons_shoes" เราใช้คำสั่ง Python print() นี่ช่วยให้เราเห็นรองเท้าทั้งหมดในเซ็ตใหม่ของเรา มาเรียกโค้ดของเราและดูสิ่งที่เกิดขึ้น:

Traceback (most recent call last):
File "main.py", line 3, in 
harrisons_shoes.extend(shoe_emporium)
AttributeError: 'set' object has no attribute 'extend'

โค้ดของเราคืนค่า AttributeError

วิธีแก้ไข AttributeError ใน Python (AttributeError Python Solution)

ข้อความข้อผิดพลาดของเราบอกเราว่าเราไม่สามารถใช้เมธอด extend() บนออบเจ็กต์ที่ประเภทข้อมูลเป็นเซ็ตได้ เนื่องจาก extend() เป็นเมธอดของรายการ (list method) มันไม่ได้รับการรองรับโดยเซ็ต

หากเราต้องการรวมเซ็ตสองอันของเรา เราต้องใช้เครื่องหมายบวก:

harrisons_shoes.update(shoe_emporium)
print(harrisons_shoes)

สิ่งนี้จะเพิ่มเนื้อหาของเซ็ต "shoe_emporium" ไปยังเซ็ต "harrisons_shoes" เราจึงพิมพ์ค่าทั้งหมดในเซ็ต "harrisons_shoes" ไปที่คอนโซล มาเรียกโปรแกรมใหม่ของเรา:

{'Nike Air Force 1 07', 'Adidas Superstar', 'Adidas Samba', 'Nike Air Max Plus', 'Adidas Gazelle'}

โปรแกรมของเราคืนค่าเซ็ตที่มีรองเท้าทั้งหมดจากเซ็ตต้นฉบับสองอันของเรา ในขณะที่มีหกค่าในเซ็ตต้นฉบับสองอันของเรา ตอนนี้มีเพียงห้าเท่านั้น เนื่องจากรองเท้าสองคู่เหมือนกันและเซ็ตสามารถจัดเก็บค่าที่ไม่ซ้ำกันเท่านั้น

โปรแกรมของเราคืนค่าเซ็ตที่มีรองเท้าทั้งหมดจากเซ็ตต้นฉบับสองอันของเรา ในขณะที่มีหกค่าในเซ็ตต้นฉบับสองอันของเรา ตอนนี้มีเพียงห้าเท่านั้น เนื่องจากรองเท้าสองคู่เหมือนกันและเซ็ตสามารถจัดเก็บค่าที่ไม่ซ้ำกันเท่านั้น

AttributeErrors ที่คล้ายกันที่ควรสำรวจ (Similar AttributeErrors to Explore)

AttributeErrors พบได้บ่อยมาก พวกเขาอาจเกิดขึ้นเมื่อคุณพยายามเรียกแอตทริบิวต์ของประเภทข้อมูลและคลาสที่ไม่รองรับแอตทริบิวต์ที่คุณอ้างอิง

ข้อผิดพลาดเหล่านี้อาจเกิดจากการที่คุณทำ typo เมื่ออ้างอิงแอตทริบิวต์ Python จะตีความโค้ดของคุณตาม原样 หากคุณทำ typo มันจะปรากฏให้ Python ว่าคุณอ้างอิงแอตทริบิวต์ที่ไม่มีอยู่

ตัวอย่างเช่น การใช้เมธอด Python split() เพื่อแบ่งรายการเป็นเรื่องปกติ แต่ split() เป็นเมธอดสตริง และดังนั้นไม่สามารถใช้แบ่งรายการได้

สำหรับการอ่านเพิ่มเติม พิจารณาค้นหาข้อผิดพลาดต่อไปนี้:

  • AttributeError: 'list' object has no attribute 'split'
  • AttributeError: 'module' object has no attribute 'urlopen'

สรุป

ข้อผิดพลาดแอตทริบิวต์ใน Python ถูกโยนออกมาเมื่อมีการอ้างอิงแอตทริบิวต์ที่ไม่ถูกต้อง เพื่อแก้ไขข้อผิดพลาดเหล่านี้ ให้ตรวจสอบก่อนว่าแอตทริบิวต์ที่คุณเรียกมีอยู่จริง จากนั้น ตรวจสอบว่าแอตทริบิวต์เกี่ยวข้องกับออบเจ็กต์หรือประเภทข้อมูลที่คุณกำลังทำงานอยู่

หากแอตทริบิวต์ที่คุณต้องการเกี่ยวข้องกับประเภทในตัว (built-in type) และไม่มีอยู่ คุณควรค้นหาวิธีทางเลือก มีทางเลือกสำหรับแอตทริบิวต์หลายอย่างที่มีอยู่สำหรับประเภทข้อมูลหนึ่งที่คุณสามารถใช้บนอีกประเภทข้อมูลหนึ่ง ตัวอย่างเช่น ไม่มีเมธอด extend() กับเซ็ต แต่คุณสามารถใช้ union() เพื่อรวมเซ็ตสองอัน

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนโค้ด Python โปรดอ่านคู่มือ How to Learn Python ของเรา