Tại sao cấu trúc như vậyNameError: tên 'tự' không được định nghĩa
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
?
Tại sao cấu trúc như vậyNameError: tên 'tự' không được định nghĩa
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
?
Giá trị đối số mặc định được đánh giá tại hàm xác định thời gian, nhưng self
là đối số chỉ khả dụng tại thời gian gọi hàm. Vì vậy các đối số trong danh sách đối số không thể tham chiếu lẫn nhau.
Đó là một mô hình phổ biến để mặc định một cuộc tranh cãi để None
và thêm một kiểm tra cho rằng trong mã:
def p(self, b=None):
if b is None:
b = self.a
print b
Đối với trường hợp bạn cũng muốn có tùy chọn thiết lập 'b' để None:
def p(self, **kwargs):
b = kwargs.get('b', self.a)
print b
Không chắc chắn những gì quá phức tạp về nó. Cảm thấy tự do để kêu vang với giải pháp của riêng bạn mà bảo toàn tất cả các giá trị của b. – Andrew
Nếu bạn đã đến đây thông qua google, hãy đảm bảo rằng bạn đã tự cho mình tham số đầu tiên cho một hàm lớp. Đặc biệt là 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 định nghĩa
def foo(self):
print(self.bar)
> "Chúc mừng bạn đã thoát khỏi những NameError!"
Mặc dù tôi nghĩ rằng ở trên không phải là rất đẹp (tôi đến từ ruby nơi mọi thứ chỉ hoạt động tốt), trên thực sự hoạt động như một workaround. Nó vẫn còn lúng túng mà python đã chọn để làm cho tự không có sẵn trong một danh sách tham số. – shevy