我的课程Test
包含Test.att1
,Test.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
但寻求更好的方式
答案 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并设置新的。