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
加入'回報self'作品。我以爲我正在改變可變的實例屬性,所以我不必返回self..just就像我上面的'add'方法。在'__add__'的情況下,我要返回一個新的對象,所以需要返回。對於'__iadd__'來說,因爲它是就地添加的,所以我錯誤地認爲改變自我狀態將直接反映出來。 –
@ user1988876:如果你使用原始的'+ =',並保留另一個對象的引用以便你可以檢查它,你會發現它實際上是對原始對象進行變異,它只是將它重新命名爲' None'。你想讓它改變原來的對象,並保持名字綁定到'self'。 – abarnert