2013-07-04 17 views

Trả lời

8

Khi bạn làm board[x][y] bạn sẽ gây ra hai gọi tới số __getitem__ vì bạn đang thực hiện hai truy cập riêng biệt: [x] là một và [y] là loại khác. Không có cách nào để xử lý điều này trực tiếp trong __getitem__; bạn phải có board[x] trả lại một số loại đối tượng phụ mà bạn có thể sử dụng [y] để nhận mục riêng lẻ. Những gì bạn có thể muốn là phải có __getitem__ chấp nhận một tuple:

def __getitem__(self, tup): 
    y, x = tup 
    return self.board[y][x] 

Sau đó làm:

board[x, y] 

(Lưu ý rằng bạn có thứ tự của x và y chuyển giữa __getitem__board[x][y] --- là cố ý?)

2

board[x][y] nghĩa board.__getitem__(x).__getitem__(y), vì vậy Board.__getitem__ đã trở lại một số loại quan điểm cho rằng cũng hỗ trợ __getitem__ và nhớ x. Đây là một chút công việc, nhưng đối với một số trường hợp sử dụng (bất cứ điều gì liên quan đến việc xem mà xem xung quanh) nó rất thuận tiện.

Tùy chọn khác là board[x, y], có nghĩa là board.__getitem__((x, y)). Lưu ý rằng điều này chuyển một tuple đến __getitem__, mà bạn sẽ phải giải nén thủ công (có cú pháp đường để làm điều này trong 2.x, nhưng nó là một chút mơ hồ và cũng đi trong 3.x, vì vậy bạn có thể muốn tránh nó vì lợi ích của công việc chuyển cảng trong tương lai).

3

Chỉ cần làm:

class Board(): 
    def __getitem__(self, x): 
     return self.board[x] 

bởi vì khi bạn gọi b[x][y] nó thực sự gọi __getitem__() hai lần, như thể hiện dưới đây:

import numpy as np 
b = Board() 
b.board = np.random.random((3,3,3)) 
print (b[2][0]==(b[2])[0]).all() 
#True 

Nhưng tốt nhất là nên phân lớp np.ndarray, do đó bạn don' t phải triển khai lại phương pháp này:

class Board(np.ndarray): 
    pass 
1

Bạn có thể muốn xem xét sử dụng cú pháp này:

board[(x, y)] 

Nó ít đẹp hơn, nhưng nó cho phép bạn có nhiều mảng đơn giản. Bất kỳ số lượng kích thước thực tế:

board[(1,6,34,2,6)] 

Bằng cách làm cho hội đồng quản trị một defaultdict bạn thậm chí có thể có từ điển thưa thớt:

board[(1,6,34,2,6)] 

>>> from collections import defaultdict 
>>> board = defaultdict(lambda: 0) 
>>> board[(1,6,8)] = 7 
>>> board[(1,6,8)] 
7 
>>> board[(5,6,3)] 
0 

Nếu bạn muốn một cái gì đó tiến bộ hơn mà bạn có thể muốn NumPy.

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