แอตทริบิวต์ (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, inharrisons_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 ของเรา