Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Lỗi Python NameError: name 'self' is not defined - Giải pháp

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

Bạn không truy cập "self" trong đối số chỉ định cho phương thức, hoặc bên trong hàm không chỉ định "self" như đối số. Nếu không, thấy lỗi "NameError: name 'self' is not defined".

Trong hướng dẫn này, nói về ý nghĩa lỗi và tại sao nêu lên. Chúng ta đi qua vài đoạn mã giúp bạn tìm cách khắc phục lỗi trong mã.

NameError: name 'self' is not defined

Biến "self" giữ thông tin đối tượng bên trong lớp. Tất cả giá trị gán cho đối tượng có sẵn trong "self".

"self" phải truyền như đối số nếu muốn dùng trong phương thức. Biến "self" không dùng trong đối số khác phương thức vì chỉ truy cập từ bên trong phương thức.

Bạn gặp "NameError: name 'self' is not defined" nếu:

  • Không chỉ định "self" như đối số
  • Dùng "self" như đối số trong đối số khác

Hãy đi qua từng tình huống.

Tình huống #1: "self" không liệt kê như đối số

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

81% người tham gia cho biết họ cảm thấy tự tin hơn về cơ hội việc làm công nghệ sau khi tham gia bootcamp. Được ghép nối với bootcamp ngay hôm nay.

Sinh viên trung bình tốt nghiệp bootcamp mất chưa đến sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được việc đầu tiên.

Viết chương trình giữ thông tin phim trong lớp. Bắt đầu định nghĩa lớp với constructor giữ giá trị phim:

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

Lớp giữ hai giá trị: tên phim và năm phát hành. Tiếp theo, khai báo phương thức thay đổi "year_released":

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

Để test, tạo đối tượng lớp. Đối tượng đại diện phim Happy Gilmore, phát hành 1996:

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

Gọi change_year() trên đối tượng đặt năm phát hành 1996. Hãy chạy mã xem:

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ã báo lỗi.

Lỗi nêu lên vì chưa truyền "self" đối số phương thức. Khắc phục bằng thêm "self" đối số đầu trong change_year():

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

Chạy mã lại:

Happy Gilmore was released in 1996.

Mã chạy thành công!

Tình huống #2: Dùng "self" như đối số trong đối số khác

"self" đánh giá khi hàm gọi. Nghĩa là không thể có đối số tham chiếu "self" trong danh sách đối số chỉ định gọi hàm.

Cập nhật phương thức "year_released" để, nếu năm phát hành khác không chỉ định, thông báo in ra console năm phim không thay đổi.

Làm bằng đặt đối số mặc định mã:

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" giờ giá trị mặc định "self.year_released". Nghĩa là nếu không chỉ định giá trị năm thay đổi, giá trị mặc định đặt. Nếu chỉ định giá trị, giá trị chỉ định dùng thay mặc định.

Nếu giá trị chỉ định không bằng "self.year_released", giá trị "self.year_released" thay đổi. Ngược lại, thông báo in ra console phim không thay đổi.

Sau if đánh giá, giá trị "year_released" in ra console.

Hãy chạy mã:

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ã báo lỗi. Vì cố dùng "self" trong đối số khác danh sách đối số.

Khắc phục bằng đặt giá trị "year_released" bằng "self.year_released" bên trong hàm thay vì danh sách đối số:

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)

Mã này, đặt "year_released" bằng "self.year_released" nếu không chỉ định giá trị "year_released" gọi hàm.

Hãy tạo đối tượng Movie mới test mã:

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

Chỉ định sai năm Happy Gilmore phát hành 1995. Cần thay đổi dùng change_year(). Mã trả về:

Happy Gilmore was released in 1996. 1996

Mã thực thi thành công. Hãy test xem nếu "year_released" đã bằng giá trị chỉ định trong change_year():

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

Mã trả về:

This movie has not been changed. 1996

Mã thực thi else báo phim không thay đổi.

Kết luận

Lỗi "NameError: name 'self' is not defined" nêu lên khi quên chỉ định "self" đối số vị trí hoặc dùng "self" trong đối số khác danh sách đối số.

Khắc phục bằng đảm bảo mọi phương thức lớp dùng "self" bao gồm "self" danh sách đối số. Nếu không, kiểm tra không đối số danh sách phụ thuộc "self" giá trị mặc định.

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