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

Python NameError:name ‘self’ không được xác định Giải pháp

Giá trị “self” chỉ có sẵn bên trong một phương thức khi một hàm được gọi và chỉ định.

Bạn không thể truy cập “self” trong các đối số được chỉ định cho một phương thức hoặc bên trong một hàm mà không chỉ định “self” làm đối số. Nếu không, bạn sẽ thấy lỗi “NameError:name‘ self ’không được xác định”.

Trong hướng dẫn này, chúng tôi nói về lỗi này có nghĩa là gì và tại sao nó lại xuất hiện. Chúng tôi xem qua một vài đoạn mã để giúp bạn tìm ra cách giải quyết lỗi này trong mã của bạn.

NameError:tên ‘self’ không được xác định

Biến “self” chứa thông tin về một đối tượng bên trong một lớp. Tất cả các giá trị đã được gán cho một đối tượng đều có sẵn trong biến "self".

“Self” phải được chuyển làm đối số nếu bạn muốn sử dụng nó trong một phương thức. Không thể sử dụng biến “self” trong các đối số khác trong một phương thức vì nó chỉ có thể truy cập được từ bên trong một phương thức.

Bạn gặp phải lỗi “NameError:tên‘ self ’không được xác định” nếu bạn:

  • Không chỉ định "bản thân" làm đối số
  • Sử dụng "bản thân" làm đối số trong một lập luận khác

Hãy cùng tìm hiểu từng tình huống trong số này.

Tình huống số 1:“bản thân” không được liệt kê dưới dạng đối số

“Self” phải được liệt kê như một đối số để nó có thể truy cập được trong một phương thức. "Self" không phải là một biến toàn cục. Nó là cục bộ bên trong một lớp.

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 một cuộc thi đà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ọ.

Viết chương trình lưu trữ thông tin về phim trong một lớp. Chúng tôi bắt đầu bằng cách xác định lớp của chúng tôi với một hàm tạo chứa các giá trị về phim của chúng tôi:

class Movie:
	def __init__(self, name, year_released):
			self.name = name
			self.year_released = year_released

Lớp của chúng ta có thể chứa hai giá trị:tên của một bộ phim và năm phim được phát hành. Tiếp theo, chúng tôi khai báo một phương thức cho phép chúng tôi thay đổi giá trị của “year_released”:

	def change_year(year_released):
		   self.year_released = year_released
		   print("{} was released in {}.".format(self.name, self.year_released))

Để kiểm tra mã của chúng tôi, chúng tôi tạo một đối tượng của lớp của chúng tôi. Vật thể này đại diện cho bộ phim Happy Gilmore, phát hành năm 1996:

happy_gilmore = Movie("Happy Gilmore")
happy_gilmore.change_year(1996)

Chúng tôi đã gọi change_year() trên đối tượng của chúng tôi để chúng tôi có thể đặt năm phát hành phim là 1996. Hãy chạy mã của chúng tôi và xem nó có hoạt động không:

Traceback (most recent call last):
  File "main.py", line 11, in <module>
	happy_gilmore.change_year()
  File "main.py", line 7, in change_year
	self.year_released = year_released
NameError: name 'self' is not defined

Mã của chúng tôi trả về lỗi.

Lỗi này xuất hiện bởi vì chúng tôi đã không chuyển “self” làm đối số cho phương pháp của mình. Chúng tôi sửa lỗi này bằng cách thêm “self” làm đối số đầu tiên trong change_year() phương pháp:

def change_year(self, year_released):
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))

Chạy lại mã của chúng tôi:

Happy Gilmore was released in 1996.

Mã của chúng tôi chạy thành công!

Tình huống số 2:Sử dụng “self” làm đối số trong một đối số khác

“Self” được đánh giá khi một hàm được gọi. Điều này có nghĩa là bạn không thể có một đối số tham chiếu đến "self" trong danh sách các đối số được chỉ định trong một lệnh gọi hàm.

Cập nhật phương thức “year_released” của chúng tôi để, nếu năm phát hành khác không được chỉ định, một thông báo sẽ được in ra bảng điều khiển cho chúng tôi biết rằng năm của một bộ phim không bị thay đổi.

Chúng tôi có thể thực hiện việc này bằng cách đặt một đối số mặc định trong mã của chúng tôi:

def change_year(self, year_released=self.year_released):
	if year_released != self.year_released:
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))
	else:
		print("This movie has not been changed.")

	print(year_released)

“Year_released” hiện có giá trị mặc định là “self.year_released”. Điều này có nghĩa là nếu chúng tôi không chỉ định một giá trị mà năm sẽ được thay đổi, một giá trị mặc định sẽ được đặt. Nếu chúng tôi chỉ định một giá trị, giá trị chúng tôi chỉ định sẽ được sử dụng thay vì giá trị mặc định.

Nếu giá trị chúng tôi chỉ định không bằng giá trị của “self.year_released”, thì giá trị của “self.year_released” sẽ bị thay đổi. Nếu không, một thông báo được in ra bảng điều khiển cho người dùng biết rằng phim chưa được thay đổi.

Sau if của chúng tôi câu lệnh đã được đánh giá, giá trị của “year_released” được in ra bảng điều khiển.

Hãy chạy mã của chúng tôi:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
	class Movie:
  File "main.py", line 6, in Movie
	def change_year(self, year_released=self.year_released):
NameError: name 'self' is not defined

Mã của chúng tôi phát sinh lỗi. Điều này là do chúng tôi đã cố gắng sử dụng “self” trong một đối số khác trong danh sách các đối số của mình.

Chúng tôi có thể sửa lỗi này bằng cách đặt giá trị của biến “year_released” thành “self.year_released” bên trong hàm thay vì trong danh sách các đối số của chúng tôi:

def change_year(self, year_released=None):
	if year_released != self.year_released:
		self.year_released = year_released
		print("{} was released in {}.".format(self.name, self.year_released))
	else:
		year_released = self.year_released
		print("This movie has not been changed.")

	print(year_released)

Trong mã này, chúng tôi đặt “year_released” bằng “self.year_released” nếu chúng tôi không chỉ định giá trị cho “year_released” trong lệnh gọi hàm của mình.

Hãy tạo một đối tượng Phim mới để kiểm tra mã của chúng tôi:

happy_gilmore = Movie("Happy Gilmore", 1995)
happy_gilmore.change_year(1996)

Chúng tôi đã chỉ định không chính xác năm Happy Gilmore được phát hành là 1995. Chúng tôi cần thay đổi nó bằng cách sử dụng change_year() phương pháp. Mã của chúng tôi trả về:

Happy Gilmore was released in 1996.
1996

Mã của chúng tôi đã được thực thi thành công. Hãy kiểm tra mã của chúng tôi để xem điều gì sẽ xảy ra nếu giá trị của “year_released” đã bằng giá trị mà chúng tôi chỉ định trong change_year() phương pháp:

happy_gilmore = Movie("Happy Gilmore", 1996)
happy_gilmore.change_year(1996)

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

This movie has not been changed.
1996

Mã của chúng tôi thực thi else trong mã của chúng tôi và sau đó cho chúng tôi biết rằng bộ phim chưa được thay đổi.

Kết luận

Lỗi “NameError:name‘ self ’không được xác định” xuất hiện khi bạn quên chỉ định “self” làm đối số vị trí hoặc khi bạn sử dụng “self” trong một đối số khác trong danh sách các đối số.

Bạn giải quyết lỗi này bằng cách đảm bảo rằng tất cả các phương thức trong một hàm sử dụng “self” đều bao gồm “self” trong danh sách các đối số của chúng. Nếu điều đó không hiệu quả, hãy đảm bảo rằng không có đối số nào trong danh sách các đối số phụ thuộc vào “self” cho các giá trị mặc định của chúng.

Bây giờ, bạn đã sẵn sàng để giải quyết lỗi Python này như một nhà phát triển chuyên nghiệp!