`+ =`导致类实例的'none`

时间:2018-04-20 12:01:01

标签: python python-3.x class operator-overloading

我只想使用__add__修饰符,使用'+ ='轻松添加到类实例的元素:

class Problem:
    def __init__(self):
        self.lItems = []

    def __add__(self, other):
        self.lItems.append(other)


problem = Problem()
problem += 'text'
print(problem)

None之后产生的问题将等于+=。为什么?我怎样才能防止这种情况发生?

P.S。:我也试过实施__iadd__而没有效果......

3 个答案:

答案 0 :(得分:4)

您需要从__add__

返回实例的新状态
class Problem:
    def __init__(self):
        self.lItems = []

    def __add__(self, other):
        self.lItems.append(other)
        return self

但是,现在使用+时遇到问题:

a = Problem()

b = a + 5

print (a)
print (b)

结果:

<__main__.Problem instance at 0x0022BE40>
<__main__.Problem instance at 0x0022BE40>

ab是同一个实例!我们希望ba不同,在其lItems中有一个额外的对象。

这就是您要使用__iadd__方法的原因。它仅适用于+=

class Problem:
    def __init__(self):
        self.lItems = []

    def __iadd__(self, other):
        self.lItems.append(other)
        return self

...并且使用+导致错误,应该如此。

答案 1 :(得分:0)

append操作后,您需要return该对象。

class Problem:
    def __init__(self):
        self.lItems = []

    def __iadd__(self, other):
        self.lItems.append(other)
        return self

实施例

>>> problem = Problem()
>>> problem += 'text'
>>> problem.lItems
['text']
>>> problem += 'foobar'
>>> problem.lItems
['text', 'foobar']

答案 2 :(得分:-2)

只需要在添加方法中返回一些内容,我认为这就是你想要的:

class Problem:
    def __init__(self):
        self.lItems = []

    def __add__(self, other):
        self.lItems.append(other)
        return self


problem = Problem()
problem += 'text'
print(problem)
print(problem.lItems)

输出:

<__main__.Problem object at 0x04BBDCD0>
['text']