NameError: tên 'tự' không được xác định


144

Tại sao cấu trúc như vậy

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

đưa ra một lỗi NameError: name 'self' is not defined?

Câu trả lời:


159

Các giá trị đối số mặc định được đánh giá tại thời gian xác định hàm, nhưng selflà một đối số chỉ khả dụng tại thời gian gọi hàm. Do đó, các đối số trong danh sách đối số không thể tham chiếu lẫn nhau.

Đó là một mẫu chung để mặc định một đối số Nonevà thêm một bài kiểm tra cho mã đó:

def p(self, b=None):
    if b is None:
        b = self.a
    print b

4
Mặc dù tôi nghĩ rằng những thứ ở trên không đẹp lắm (tôi đến từ ruby ​​nơi mọi thứ chỉ hoạt động tốt), nhưng những thứ trên thực sự hoạt động như một cách giải quyết. Vẫn còn lúng túng khi trăn chọn tự làm không có sẵn trong danh sách tham số.
shevy

2
@shevy: "tự" không có ý nghĩa đặc biệt trong python, nó chỉ là tên được chọn theo quy ước cho đối số đầu tiên. Bạn cũng có thể thay thế "bản thân" bằng "tôi" hoặc "x".
Tối đa

Không có cách nào tốt hơn để làm điều này? Nếu chúng ta có một hàm có một tá đối số mặc định nên tự tham chiếu, chúng ta có thực sự cần một tá các câu lệnh if không? Điều này là vô cùng khó xử.
Richard J. Barbalace

16

Đối với trường hợp bạn cũng muốn có tùy chọn cài đặt 'b' thành Không:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b

6

Nếu bạn đã đến đây thông qua google, vui lòng đảm bảo kiểm tra xem bạn đã tự cho mình là tham số đầu tiên cho hàm lớp. Đặc biệt nếu bạn cố gắng tham chiếu các giá trị cho đối tượng đó bên trong hàm.

def foo():
    print(self.bar)

> NameError: tên 'tự' không được xác định

def foo(self):
    print(self.bar)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.