2013-07-04 53 views

回答

8

當你做board[x][y]會給你帶來致電__getitem__,因爲您正在進行兩次單獨訪問:[x]是一個,[y]是另一個。沒有辦法直接在__getitem__中處理這個;你必須有board[x]返回某種子對象,你可以使用[y]來獲得單個項目。你可能想的是讓__getitem__接受一個元組:

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

然後做:

board[x, y] 

(請注意,您有x和y的__getitem__board[x][y]之間切換的順序 - 是故意的嗎?)

2

board[x][y]意味着board.__getitem__(x).__getitem__(y),所以Board.__getitem__必須返回某種觀點,也支持__getitem__並記住x。這是一些工作,但對於一些使用情況(任何涉及傳遞視圖的任何情況)都非常方便。

另一種選擇是board[x, y],這意味着board.__getitem__((x, y))。請注意,這將一個元組傳遞給__getitem__,您必須手動解包(在2.x中有這樣的語法糖,但它有點模糊,並且在3.x中也不見了,所以您可能需要避免它爲了將來的移植工作)。

3

只要做到:

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

,因爲當你調用b[x][y]它實際上調用__getitem__()兩次,如下顯示:

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

但是,最好將繼承np.ndarray,讓你不不得不重新實施這種方法:

class Board(np.ndarray): 
    pass 
1

您可能要考慮使用這種語法:

board[(x, y)] 

它不太漂亮,但它可以讓你有多維數組簡單。任何數量其實維度:如果你想要的東西比你可能要NumPy更先進

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 

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

通過使板defaultdict你甚至可以有稀疏的字典。

相關問題