更新多个属性python

时间:2017-09-07 04:29:29

标签: python class attributes

我的课程Test包含Test.att1Test.att2,...,Test.att10属性。我有一个方法Test.update(),可以计算十个新值vals = [v1, v2, ... , v10]。我想在单个for循环中更新Test的属性。

我设想循环遍历mylist = [self.att1, self.att2, ... , self.att10]类中的列表Test并设置每vals的值,但这似乎不起作用。在不使用self.att1, self.att2, self.att3 = v1, v2, v3结构的情况下,我可以做什么/更新多个属性的最佳方式?

编辑:我特别问,因为我做的事情是:

a1, a2, a3, a4, a5 = self.update()
self.a1 = pd.concat([self.a1, a1]).drop_duplicates().reset_index(drop=True)
self.a2 = pd.concat([self.a2, a2]).drop_duplicates().reset_index(drop=True)
self.a3 = pd.concat([self.a3, a3]).drop_duplicates().reset_index(drop=True)
self.a4 = pd.concat([self.a4, a4]).drop_duplicates().reset_index(drop=True)
self.a5 = pd.concat([self.a5, a5]).drop_duplicates().reset_index(drop=True)

我正在使用 我最终做的一个倒退方式是:

def update(self):
    dfs = [self.att1, self.att2, ..., self.att10]
    dfs = [pd.concat([dfs[i], vals[i]]).drop_duplicates().reset_index(drop=True) \
                for i in range(len(dfs))]
    [self.att1, self.att2, ..., self.att10] = dfs

但寻求更好的方式

1 个答案:

答案 0 :(得分:1)

您可以在setattr的combinatin中使用hasattr来更新目标对象并将其添加到目标对象。

attrs = [a for a in dir(Test) if a.startswith('attr') and 'no_update' not in a]

### To update existing attrs ###
new_vals = [...]
for a, v in zip(attrs, new_vals):
    if hasattr(Test, a):
        setattr(Test, a, v)

### To add new attrs ###
new_vals = [...]
start = int(attrs[-1][4:]) + 1 # the number the new attrs should start at
new_attrs = ['attr%d' % n for n in range(start, start+len(new_vals))] # if start==4 and len(new_vals)==3: return ['attr5', 'attr6', 'attr7']
for a, v in zip(new_attrs, new_vals):
    setattr(Test, a, v)

这些也可以结合使用,以便在需要时更新现有的attrs并设置新的。