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

Python TypeError:วัตถุ 'เมธอด' นั้นไม่สามารถเขียนทับได้ Solution

อาร์กิวเมนต์ในเมธอด Python ต้องระบุไว้ในวงเล็บ เนื่องจากทั้งฟังก์ชันและเมธอดใช้วงเล็บเพื่อระบุว่ามีการเรียกหรือไม่ หากคุณใช้วงเล็บเหลี่ยมเพื่อเรียกเมธอด คุณจะพบข้อผิดพลาด "TypeError:'method' object is not subscriptable"

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

TypeError:วัตถุ 'เมธอด' ไม่สามารถระบุได้

ออบเจ็กต์ที่เขียนทับได้คืออ็อบเจ็กต์ที่มีเมธอด __getitem__ เหล่านี้เป็นชนิดข้อมูล เช่น รายการ พจนานุกรม และทูเพิล เมธอด __getitem__ อนุญาตให้ล่าม Python ดึงไอเท็มแต่ละรายการจากคอลเล็กชัน

ออบเจ็กต์บางรายการไม่สามารถระบุได้ วิธีการเช่นไม่ได้ นั่นเป็นเพราะพวกเขาไม่ได้ใช้เมธอด __getitem__ ซึ่งหมายความว่าคุณไม่สามารถใช้ไวยากรณ์วงเล็บเหลี่ยมเพื่อเข้าถึงรายการในเมธอดหรือเรียกเมธอดได้

พิจารณาข้อมูลโค้ดต่อไปนี้:

cheeses = ["Edam", "Stilton", "English Cheddar", "Parmesan"]
print(cheeses[0])

รหัสนี้ส่งคืน "Edam" ชีสที่ตำแหน่งดัชนี 0 เราไม่สามารถใช้วงเล็บเหลี่ยมเพื่อเรียกใช้ฟังก์ชันหรือเมธอดได้เนื่องจากฟังก์ชันและเมธอดไม่ใช่อ็อบเจ็กต์ที่ห้อยลงมาได้

ตัวอย่างสถานการณ์

ที่นี่ เราสร้างโปรแกรมที่เก็บชีสไว้ในวัตถุ คลาส “ชีส” ที่เราใช้กำหนดชีสจะมีวิธีการตรวจสอบว่าชีสมาจากประเทศต้นกำเนิดหรือไม่

เริ่มต้นด้วยการกำหนดคลาสสำหรับชีสของเรา เราเรียกชั้นนี้ว่าชีส:

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

class Cheese:
	def __init__(self, name, origin):
		self.name = name
		self.origin = origin

	def get_country(self, to_compare):
		if to_compare == self.origin:
			print("{} is from {}.".format(self.name, self.origin))
		else:
			print("{} is not from {}. It is from {}.".format(self.name, to_compare, self.origin))

ชั้นเรียนของเรามีสองวิธี วิธีแรกกำหนดโครงสร้างของวัตถุชีส อย่างที่สองให้เราตรวจสอบว่าประเทศต้นกำเนิดของชีสมีค่าเท่ากับค่าใดค่าหนึ่งหรือไม่

ต่อไป เราสร้างวัตถุจากคลาสชีสของเรา:

edam = Cheese("Edam", "Netherlands")

ตัวแปร "edam" เป็นวัตถุ ชื่อที่เกี่ยวข้องกับชีสคือ Edam และประเทศต้นกำเนิดคือเนเธอร์แลนด์

ต่อไป เรียก get_country() . ของเรา กระบวนการ:

edam.get_country["Germany"]

รหัสนี้รัน get_country() วิธีการจากคลาสชีส get_country() วิธีตรวจสอบว่าค่าของ "ต้นกำเนิด" ในวัตถุ "edam" ของเราเท่ากับ "เยอรมนี" หรือไม่

เรียกใช้โค้ดของเราและดูว่าเกิดอะไรขึ้น:

Traceback (most recent call last):
  File "main.py", line 14, in <module>
	edam.get_country["Germany"]
TypeError: 'method' object is not subscriptable

เกิดข้อผิดพลาดในรหัสของเรา

การแก้ปัญหา

มาวิเคราะห์บรรทัดของโค้ดที่โปรแกรมดีบั๊ก Python ระบุว่าผิดพลาด:

edam.get_country["Germany"]

ในโค้ดบรรทัดนี้ เราใช้วงเล็บเหลี่ยมเพื่อเรียก get_country() กระบวนการ. ไวยากรณ์นี้ไม่เป็นที่ยอมรับ เนื่องจากมีการใช้วงเล็บเหลี่ยมเพื่อเข้าถึงรายการจากรายการ เนื่องจากฟังก์ชันและอ็อบเจ็กต์ไม่สามารถห้อยลงได้ เราจึงไม่สามารถใช้วงเล็บเหลี่ยมเพื่อเรียกฟังก์ชันเหล่านี้ได้

เพื่อแก้ไขข้อผิดพลาดนี้ เราต้องแทนที่วงเล็บเหลี่ยมด้วยวงเล็บปีกกา:

edam.get_country("Germany")

เรียกใช้รหัสของเราและดูว่าเกิดอะไรขึ้น:

Edam is not from Germany. It is from Netherlands.

รหัสของเราดำเนินการได้สำเร็จ เรามาลองเช็คกันว่า Edam มาจาก "เนเธอร์แลนด์" หรือไม่ เพื่อให้แน่ใจว่าฟังก์ชันของเราใช้งานได้ทุกกรณี ไม่ว่าค่าที่เราระบุจะเท่ากับประเทศต้นทางของชีสหรือไม่:

edam.get_country("Netherlands")

รหัสของเราส่งคืน:

Edam is from Netherlands.

รหัสของเราใช้งานได้หากค่าที่เราระบุเท่ากับประเทศต้นกำเนิดของชีส

บทสรุป

ข้อผิดพลาด "TypeError:'method' object is not subscriptable" ปรากฏขึ้นเมื่อคุณใช้วงเล็บเหลี่ยมเพื่อเรียกเมธอดภายในคลาส ในการแก้ไขข้อผิดพลาดนี้ ตรวจสอบให้แน่ใจว่าคุณเรียกใช้เมธอดของคลาสโดยใช้วงเล็บปีกกาหลังชื่อของเมธอดที่คุณต้องการเรียกเท่านั้น

ตอนนี้คุณพร้อมที่จะแก้ไขข้อผิดพลาดทั่วไปของ Python อย่างนักเขียนโค้ดมืออาชีพแล้ว!