2013-11-25 20 views
0

我正在編寫一個Queue類,它包含大部分操作的列表。但我不從list sublcass,因爲我不想提供所有list API's。我的代碼粘貼在下面。 add方法似乎工作正常,但iadd似乎出錯了,它沒有打印。 下面是代碼:在python中實現自定義類的add和iadd?

import copy 
from iterator import Iterator 
class Abstractstruc(object): 
    def __init__(self): 
     assert False 
    def __str__(self): 
     return "<%s: %s>" %(self.__class__.__name__,self.container) 

class Queue(Abstractstruc,Iterator): 

    def __init__(self,value=[]): 
     self.container=[] 
     self.size=0 
     self.concat(value) 

    def add(self, data): 
      self.container.append(data) 
    def __add__(self,other): 
     return Queue(self.container + other.container) 


    def __iadd__(self,other): 
     for i in other.container: 
      self.add(i) 

    def remove(self): 
     self.container.pop(0) 


    def peek(self): 
     return self.container[0] 


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


    def __iter__(self): 
     return Iterator(self.container) 

    def concat(self,value): 
     for i in value: 
      self.add(i) 

    def __bool__(self): 
     return len(self.container)>0 

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


    def __deepcopy__(self,memo): 
     return Queue(copy.deepcopy(self.container,memo)) 


if __name__=='__main__': 
    q5 = Queue() 
    q5.add("hello") 

    q6 = Queue() 
    q6.add("world") 

    q5 = q5+q6 

    print q5 
    q5+=q6 
    print q5  

輸出:

<Queue: ['hello', 'world']> 
None 

回答

8

__iadd__需要就地添加時返回self

def __iadd__(self,other): 
    for i in other.container: 
     self.add(i) 
    return self 

__iadd__需要返回得到的對象;爲不可變類型的新對象,可變類型,self。引述in-place operator hooks documentation

這些方法應該嘗試做的操作就地(修改self)並返回結果(可能是,但不必須是,self)。

+0

加入'回報self'作品。我以爲我正在改變可變的實例屬性,所以我不必返回self..just就像我上面的'add'方法。在'__add__'的情況下,我要返回一個新的對象,所以需要返回。對於'__iadd__'來說,因爲它是就地添加的,所以我錯誤地認爲改變自我狀態將直接反映出來。 –

+1

@ user1988876:如果你使用原始的'+ =',並保留另一個對象的引用以便你可以檢查它,你會發現它實際上是對原始對象進行變異,它只是將它重新命名爲' None'。你想讓它改變原來的對象,並保持名字綁定到'self'。 – abarnert