在python中实现自定义类的add和iadd?

时间:2013-11-25 21:58:27

标签: python class object add in-place

我正在编写一个Queue类,它包含了大部分操作的列表。但我不会从list升级,因为我不想提供所有list API's。我的代码粘贴在下面。 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

1 个答案:

答案 0 :(得分: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)。