Computer >> Máy Tính >  >> Lập trình >> Python

Python TypeError:Đối tượng ‘method’ không phải là giải pháp thay thế được

Các đối số trong các phương thức Python phải được chỉ định trong dấu ngoặc đơn. Điều này là do các hàm và phương thức đều sử dụng dấu ngoặc đơn để cho biết liệu chúng có đang được gọi hay không. Nếu bạn sử dụng dấu ngoặc vuông để gọi một phương thức, bạn sẽ gặp phải lỗi “TypeError:‘ method ’object is not subscriptable”.

Trong hướng dẫn này, chúng tôi thảo luận về lỗi này có nghĩa là gì và tại sao bạn có thể gặp phải nó. Chúng tôi xem qua một ví dụ về lỗi này để giúp bạn phát triển giải pháp.

TypeError:đối tượng ‘method’ không thể chỉ định được

Các đối tượng có thể chỉ định là các đối tượng có phương thức __getitem__. Đây là các kiểu dữ liệu như danh sách, từ điển và bộ giá trị. Phương thức __getitem__ cho phép trình thông dịch Python truy xuất một mục riêng lẻ từ một tập hợp.

Không phải tất cả các đối tượng đều có thể chỉ định được. Ví dụ, không phải là phương thức. Điều này là do họ không triển khai phương thức __getitem__. Điều này có nghĩa là bạn không thể sử dụng cú pháp dấu ngoặc vuông để truy cập các mục trong một phương thức hoặc để gọi một phương thức.

Hãy xem xét đoạn mã sau:

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

Đoạn mã này trả về "Edam", pho mát ở vị trí chỉ mục 0. Chúng ta không thể sử dụng dấu ngoặc vuông để gọi một hàm hoặc một phương thức vì các hàm và phương thức không phải là các đối tượng có thể thay thế được.

Một tình huống mẫu

Ở đây, chúng tôi xây dựng một chương trình lưu trữ pho mát trong các đối tượng. Lớp "Pho mát" mà chúng tôi sử dụng để xác định pho mát sẽ có một phương thức cho phép chúng tôi kiểm tra xem pho mát có phải từ một quốc gia xuất xứ cụ thể hay không.

Bắt đầu bằng cách xác định một lớp cho các loại pho mát của chúng tôi. Chúng tôi gọi lớp này là Phô mai:

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia chương trình đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

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))

Lớp của chúng tôi chứa hai phương thức. Phương thức đầu tiên xác định cấu trúc của đối tượng Cheese. Thứ hai cho phép chúng tôi kiểm tra xem quốc gia xuất xứ của pho mát có bằng với một giá trị cụ thể hay không.

Tiếp theo, chúng ta tạo một đối tượng từ lớp Cheese của chúng ta:

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

Biến "edam" là một đối tượng. Tên liên quan đến pho mát là Edam và quốc gia xuất xứ của nó là Hà Lan.

Tiếp theo, hãy gọi get_country() của chúng tôi phương pháp:

edam.get_country["Germany"]

Mã này thực thi get_country() phương thức từ lớp Cheese. get_country() phương pháp kiểm tra xem giá trị của “origin” trong đối tượng “edam” của chúng ta có bằng “Germany” hay không.

Chạy mã của chúng tôi và xem điều gì sẽ xảy ra:

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

Đã xảy ra lỗi trong mã của chúng tôi.

Giải pháp

Hãy phân tích dòng mã mà trình gỡ lỗi Python đã xác định là có lỗi:

edam.get_country["Germany"]

Trong dòng mã này, chúng tôi sử dụng dấu ngoặc vuông để gọi get_country() phương pháp. Cú pháp này không được chấp nhận vì dấu ngoặc vuông được sử dụng để truy cập các mục từ danh sách. Vì các hàm và đối tượng không thể thay thế được nên chúng ta không thể sử dụng dấu ngoặc vuông để gọi chúng.

Để giải quyết lỗi này, chúng ta phải thay thế dấu ngoặc vuông bằng dấu ngoặc nhọn:

edam.get_country("Germany")

Hãy chạy mã của chúng tôi và xem điều gì sẽ xảy ra:

Edam is not from Germany. It is from Netherlands.

Mã của chúng tôi thực thi thành công. Hãy thử kiểm tra xem Edam có phải đến từ “Hà Lan” hay không để đảm bảo chức năng của chúng tôi hoạt động trong mọi trường hợp, cho dù giá trị chúng tôi chỉ định có bằng với quốc gia xuất xứ của pho mát hay không:

edam.get_country("Netherlands")

Mã của chúng tôi trả về:

Edam is from Netherlands.

Mã của chúng tôi hoạt động nếu giá trị chúng tôi chỉ định bằng quốc gia xuất xứ của pho mát.

Kết luận

Lỗi “TypeError:‘ method ’object is not subscriptable” được đưa ra khi bạn sử dụng dấu ngoặc vuông để gọi một phương thức bên trong một lớp. Để giải quyết lỗi này, hãy đảm bảo rằng bạn chỉ gọi các phương thức của một lớp bằng cách sử dụng dấu ngoặc nhọn sau tên của phương thức bạn muốn gọi.

Bây giờ bạn đã sẵn sàng để giải quyết lỗi Python phổ biến này như một lập trình viên chuyên nghiệp!