2013-11-25 44 views
0

這是一個稍微獨特的請求。我想看看是否有可能添加額外的功能列表()數據結構,像「追加」我想補充下繼承列表的性能提供了新的類名座標旋轉:Python:將新功能添加到列表結構中,使用不同的名稱

class __VecRot(list): 

    def __init__(self, coords): 
     self.coords = coords 
     print coords   

    def double(self): 
     self.coords = [i*2 for i in self.coords] 

a = __VecRot([1,0,0]) 

該行代碼初始化座標,但未將'a'定義爲值爲[1,0,0]的列表。這樣的代碼執行時。

目前

print a 

>>> a 
[] 

我找

print a 

>>> a 
[1,0,0] 

和附加功能,使得以下爲真:

a.double() 
print a 
>>> a 
[2,0,0] 

是否有可能定義一個類的值?這樣它可以運載現有的數據結構?

+0

考慮直接繼承',而不是'UserList' list'。 – aragaer

回答

5

您正在複製實際的容器。如果您從list派生,則您已擁有存儲空間。試想一下:

class __VecRot(list): 

    def __init__(self, coords): 
     list.__init__(self, coords) 

    def double(self): 
     for i in range(len(self)): 
      self[i] = self[i] * 2 

a = __VecRot([1,0,0]) 

a.double() 

print a 

或者,如果你有coords場反正你也不需要從list推導:

class __VecRot: 

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

    def double(self): 
     self.coords = [i*2 for i in self.coords] 

    def __len__(self): 
     return len(self.coords) 

    def __str__(self): 
     return "__VecRot["+str(self.coords)+"]" 

    def __repr__(self): 
     return "__VecRot("+repr(self.coords)+")" 

a = __VecRot([1,0,0]) 

a.double() 

print a 

這似乎是個好習慣。您還應該重載其他列表接口方法(如__getitem__)。由於Python中的duck typing,只要它包含所有必要的方法,您的類是否從list派生並不重要。

+0

謝謝,我想我明白了。我現在要弄清楚爲什麼它使用一個簡單的函數,但沒有包含Numpy操作在內的大功能。 – CromeX

+0

啊......現在我明白你的意思是複製容器。通過使用'self = blah blah'我重新定義'self',因此它在通話中被忽略。當我保存到self [:] = blah blah'時,我發現它保留了相同的容器。謝謝 – CromeX

+0

@CromeX是的,正好。沒問題! – BartoszKP

0

可以繼承list類以在list範圍內創建自己的自定義函數。你做錯了。

這是很簡單的比你想象的:

class __VecRot(list): 

    def double(self): 
     self[:] = [i*2 for i in self[:]] 

然後你可以使用它像這樣:

>>> a = __VecRot([1,0,0]) 
>>> a 
[1, 0, 0] 
>>> a.double() 
>>> a 
[2, 0, 0] 
>>> a.double() 
>>> a 
[4, 0, 0] 
相關問題