2014-11-14 78 views
0

我想知道我是否可以使用像self[avariable]這樣的方括號,所以我實現了__getitem__。我曾嘗試代碼:使用方括號「自我」

class myclass: 
    def __getitem__(self,index): 
     return self[index] 

babe = myclass() 
print babe[4] 

當我運行這個它表明:

File "C:/Python27/df", line 3, in __getitem__ 
    return self[index] 

遞歸。

如何在Python中使用像self[name]__getitem__這樣的變量?

+0

數據來自哪裏? – ThinkChaos 2014-11-14 17:24:25

+0

@jonrsharpe其實我發佈這個問題找到使用像自我[avariable]的確切工作..如果它的posible請張貼它作爲答案 – lovemysql 2014-11-14 17:34:18

回答

4

你的班級需要有東西來索引,而不是self。例如,在這個類foo中,它有一個成員變量data,它是一個列表。因此,例如,索引操作可以索引列表data

class foo(): 
    def __init__(self, l): 
     self.data = l 

    def __getitem__(self, index): 
     return self.data[index] 

>>> a = foo([1,2,3]) 
>>> a[1] 
2 
+0

@Cybr ..有什麼辦法,我可以使用像自我[avariable] ? – lovemysql 2014-11-14 17:26:01

+2

'self [avariable]'會調用'self .__ getitem __(avariable)',因此你陷入循環。在'__getitem__'裏面,你需要確定數據應該來自哪裏(在本例中爲'self.data')。 – jonrsharpe 2014-11-14 17:26:59

+0

@jonrsharpe你可以給我一個像自我使用的代碼。[avariable] ?? ..這是可能的python ,,然後請發佈一個例子作爲答案 – lovemysql 2014-11-14 17:32:39

0
class myclass(list): 
    def __getitem__(self, key): 
     return super(myclass, self).__getitem__(key-1) 

babe = myclass() 
babe.append(1) 
babe.append(2) 
babe.append(3) 
babe.append(4) 
print babe[4] 
1

這是一個非常簡單的類來說明理論:

class Indexable(object): 

    def __getitem__(self, index): 
     print("You indexed me with {}.".format(index)) 

在使用中,則:

>>> i = Indexable() 
>>> i[12] 
You indexed me with 12. 

在這裏我們可以清楚地看到,i[12]解析爲Indexable.__getitem__(i, 12)

這種情況隨處可見 - 即使你打電話self[avariable]實例方法中(包括__getitem__),你最終會調用Indexable.__getitem__(self, avariable)。這解釋了無限循環,如果您在Indexable.__getitem__內包含self[avariable]

這將永遠是Python的情況下,你不能重新定義這種語法,而無需自己重寫。這是一種「神奇的方法」,就像str(instance)調用Class.__str__(instance)


在實踐中,你一般會要定義索引一些有益的行爲,也許你想假numpy風格逗號分隔的索引:

class NotArray(object): 

    def __init__(self, data): 
     self.data = data 

    def __getitem__(self, index): 
     data = self.data 
     for ind in index: 
      data = data[ind] 
     return data 

這可以用於像:

>>> arr = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] 
>>> arr[1, 1, 1] 
Traceback (most recent call last): 
    File "<pyshell#51>", line 1, in <module> 
    arr[1, 1, 1] 
TypeError: list indices must be integers, not tuple 
>>> arr = NotArray([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) 
>>> arr[1, 1, 1] 
8 

請注意,我們現在已經爲給定索引返回的數據定義了一個源。


您也可以使用它來實現非標準的語法,就像我在回答這個問題做:is it possible to add some new syntax in javascript?但這一般不提倡,因爲它會混淆你的代碼的讀者。