我有一个类 Test
具有属性 Test.att1
, Test.att2
, ... , Test.att10
。我有一个方法 Test.update()
可以计算十个新值 vals = [v1, v2, ... , v10]
。我想在单个 for 循环中更新 Test
的属性。
我设想在 Test
类和设置中循环遍历列表 mylist = [self.att1, self.att2, ... , self.att10]
每个 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
但在寻求更好的方法
最佳答案
您可以结合使用 setattr
和 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)
这些也可以结合起来,以允许更新现有的属性并在需要时设置新的属性。
关于python - 更新多个属性python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46087825/