Tôi biết cú pháp gạch dưới đôi nghĩa là gì đối với các thuộc tính/phương thức của lớp Python, nhưng nó có nghĩa là một cái gì đó cho đối số phương thức?Dấu gạch dưới kép cho phương thức Python * đối số *
Dường như bạn không thể chuyển đối số bắt đầu bằng dấu gạch dưới kép cho phương thức. Nó gây nhầm lẫn bởi vì bạn có thể làm điều đó cho các chức năng bình thường.
Hãy xem xét kịch bản này:
def egg(__a=None):
return __a
print "egg(1) =",
print egg(1)
print
class Spam(object):
def egg(self, __a=None):
return __a
print "Spam().egg(__a=1) =",
print Spam().egg(__a=1)
Chạy sản lượng kịch bản này:
egg(1) = 1
Spam().egg(__a=1) =
Traceback (most recent call last):
File "/....py", line 15, in <module>
print Spam().egg(__a=1)
TypeError: egg() got an unexpected keyword argument '__a'
Tôi đã kiểm tra này với Python 2.7.2.
Một số ví dụ khác
này hoạt động:
def egg(self, __a):
return __a
class Spam(object):
egg = egg
Spam().egg(__a=1)
này không:
class Spam(object):
def _egg(self, __a=None):
return __a
def egg(self, a):
return self._egg(__a=a)
Spam().egg(1)
Nếu nó xảy ra "không phân biệt nơi chúng xảy ra", tôi hy vọng các ví dụ cuối cùng (người tôi thêm) hoạt động. Tôi đoán tôi biết tại sao nó không mặc dù; nó phải ở trong "không gian tên lớp" hoặc một cái gì đó như thế (tôi không biết từ thích hợp cho điều đó) là gì, đúng không? – tkf
Tôi cũng mong đợi điều đó và tôi khá ngạc nhiên. Tôi đoán đó là một lỗ hổng trong tài liệu hoặc triển khai. Tôi đang chỉnh sửa ngay bây giờ để thêm các phát hiện của mình. – delnan
Tôi đồng ý rằng nó không phải là thông số thanh lịch, nhưng hãy xem xét khi bạn có một cái gì đó như 'tự .__ dict __. Cập nhật (kwds)' trong chức năng nhưng muốn kiểm soát hành vi của hàm. Tên đối số hợp lệ duy nhất mà tôi có thể nghĩ đến để kiểm soát hành vi là hành vi bắt đầu bằng dấu gạch dưới kép. – tkf