python 创建任意类型的空对象?

python create empty object of arbitrary type?

对于像列表这样的类型,我可以很容易地创建一个空列表来使这个构造起作用:

 s = []
 s+= [1,2,3]  # result s assigned [1,2,3]

在这样的构造中显然很有用:

 s=[]
 for v in (list1,list2,list3..):
   if condition : s+=v

现在我正在使用一个用户定义的类型,它在一个模块中定义,我无法读取或更改。我必须这样做:

 s=0
 for v in (typefoo1,typefoo2,..):
   if condition :
    if s==0 :
     s=v
    else:
     s+=v

这行得通,但是很丑,而且经常出现,这很烦人。 所以..有没有办法创建一个空对象,使得 += 运算符的行为就像常规赋值 = 而不管 r.h.s 上的类型?

编辑: 我试图故意让问题保持通用,但为了完整性,所讨论的类型是 Abaqus 几何序列。

is there a way to create an empty object such that the += operator would behave simply like a regular assignment = regardless of the type on the r.h.s?

当然可以。只需编写 class 并将 __add__ 方法定义为 return RHS 未修改。

class DummyItem:
    def __add__(self, other):
        return other

s = DummyItem()
s += 23
print s

结果:

23

假设您的列表至少有一个元素,您可以只创建一个迭代器并使用 next 获取第一个元素并将其余元素相加:

i = iter(lst)
s = next(i)
for x in i:
    s += x

您也可以使用 sum function, with a second paramter specifying the initial value: s = sum(i, next(i)). This explicitly does not work for strings, but you could also use reduce in a similar way, which will work with strings: s = reduce(operator.add, i, next(i)). Or, you could even combine this with the DummyItem from 作为 s = sum(lst, DummyItem()) 来执行此操作。这样它也适用于字符串,你可以直接使用列表而不需要创建迭代器。