2009-11-06 24 views
18

Tôi cố gắng để sử dụngCó thể sử dụng nhiều đối số trên __getitem__ không?

__getitem__(self, x, y): 

trên lớp Matrix của tôi, nhưng có vẻ như với tôi nó không hoạt động (tôi vẫn không biết rất tốt để sử dụng python). Tôi gọi nó như sau:

print matrix[0,0] 

Có thể sử dụng nhiều hơn một đối số không? Cảm ơn. Có lẽ tôi chỉ có thể sử dụng một đối số nhưng chuyển nó thành một tuple?

Trả lời

34

__getitem__ chỉ chấp nhận một đối số (không phải là tự), vì vậy bạn đã vượt qua một bộ tuple.

Bạn có thể làm điều này:

class matrix: 
    def __getitem__(self, pos): 
     x,y = pos 
     return "fetching %s, %s" % (x, y) 

m = matrix() 
print m[1,2] 

đầu ra

fetching 1, 2 

Xem http://docs.python.org/reference/datamodel.html#object.getitem để biết thêm thông tin

3

Không, __getitem__ chỉ cần một đối số (ngoài self). Trong trường hợp của matrix[0, 0], đối số là tuple (0, 0).

21

Thật vậy, khi bạn thực hiện bla[x,y], bạn đang gọi điện thoại type(bla).__getitem__(bla, (x, y)) - Python tự động hình thức tuple dành cho bạn và chuyển nó lên số __getitem__ làm đối số thứ hai (đối số đầu tiên là self). Không có cách nào tốt là [1] để thể hiện rằng __getitem__ muốn nhiều đối số hơn, nhưng cũng không cần.



[1] Trong Python 2.* bạn có thể thực sự cung cấp __getitem__ một chữ ký tự động giải nén mà sẽ nâng cao ValueError hoặc TypeError khi bạn đang lập chỉ mục với quá nhiều hoặc quá ít chỉ số .. .:

>>> class X(object): 
... def __getitem__(self, (x, y)): return x, y 
... 
>>> x = X() 
>>> x[23, 45] 
(23, 45) 

Cho dù đó là "một cách tốt" là tranh luận ... nó không được dùng trong Python 3 để bạn có thể phỏng đoán rằng Guido đã không không xem xét nó tốt khi phản ánh dài ;-). Việc giải nén của riêng bạn (của một đối số duy nhất trong chữ ký) không phải là vấn đề lớn và cho phép bạn cung cấp các lỗi rõ ràng hơn (và những cái thống nhất, chứ không phải là các kiểu khác nhau cho lỗi rất giống nhau khi lập chỉ mục ví dụ như vậy với 1 vs, 3 chỉ số ;-).

+0

Sự hiểu biết của tôi về việc không sử dụng đối số giải nén trong 3.x không nhiều đến mức "Guido không coi nó là tốt", nhưng càng khó có ai biết tính năng này thậm chí còn tồn tại trong ngôn ngữ và . –

+0

@Laurence, yep - phức tạp và rất hiếm khi được sử dụng -> không tốt! -) –

+2

Tôi thường xuyên sử dụng nó và nó đã được khá tốt đẹp, nhưng vấn đề là nó phản ánh phức tạp. Tôi chủ yếu sẽ bỏ lỡ nó để sử dụng trong các hàm lambda – Casebash

Các vấn đề liên quan