如何在Python函数中为类属性名称使用占位符?
动态替换Python类属性中的数字后缀问题
我写了下面这个Python函数:
def sok_funk(self, lagnr, skivenr, dato, x): self.lagnr = lagnr self.skivenr = skivenr self.dato = dato self.x = x print("Printing lagnr, skivenr, og dato ", lagnr, skivenr, dato, x) c = conn.cursor() get_from_db = "SELECT * FROM trening_og_oppskyting WHERE Lagnr = {} AND Skivenr = {}\ AND Dato = '{}'".format(lagnr, skivenr, dato) c.execute(get_from_db) conn.commit() sk_1 = c.fetchall() xy = 1 if sk_1 == []: self.navn_sk_1.clear() self.tr_1_sk_1.setChecked(False) self.tr_2_sk_1.setChecked(False) self.oppsk_1_sk_1.setChecked(False) self.oppsk_2_sk_1.setChecked(False) self.notatfelt_sk_1.clear() else: for row in sk_1: self.navn_sk_1.setText(row[2]) self.notatfelt_sk_1.setText(row[8]) if row[4] == 1: self.tr_1_sk_1.setChecked(True) elif row[4] == 0: self.tr_1_sk_1.setChecked(False) if row[5] == 1: self.tr_2_sk_1.setChecked(True) elif row[5] == 0: self.tr_2_sk_1.setChecked(False) if row[6] == 1: self.oppsk_1_sk_1.setChecked(True) elif row[6] == 0: self.oppsk_1_sk_1.setChecked(False) if row[7] == 1: self.oppsk_2_sk_1.setChecked(True) elif row[7] == 0: self.oppsk_2_sk_1.setChecked(False)
我想把所有包含sk_1的语句里的数字1替换成参数x的值,试过self.name_sk_{}.clear().format(x)但没用,请问该怎么实现?
解决方案
你不能直接在属性名里用字符串格式化语法,得用Python内置的getattr()函数来动态获取类实例的属性,之后再调用对应的方法。
具体改造步骤:
- 处理空结果的分支:
把原来的固定属性调用改成getattr动态获取,用f-string生成对应属性名:
if sk_1 == []: getattr(self, f"navn_sk_{x}").clear() getattr(self, f"tr_1_sk_{x}").setChecked(False) getattr(self, f"tr_2_sk_{x}").setChecked(False) getattr(self, f"oppsk_1_sk_{x}").setChecked(False) getattr(self, f"oppsk_2_sk_{x}").setChecked(False) getattr(self, f"notatfelt_sk_{x}").clear()
- 处理有结果的分支:
同样用getattr()替换所有带sk_1的属性调用:
else: for row in sk_1: getattr(self, f"navn_sk_{x}").setText(row[2]) getattr(self, f"notatfelt_sk_{x}").setText(row[8]) if row[4] == 1: getattr(self, f"tr_1_sk_{x}").setChecked(True) elif row[4] == 0: getattr(self, f"tr_1_sk_{x}").setChecked(False) if row[5] == 1: getattr(self, f"tr_2_sk_{x}").setChecked(True) elif row[5] == 0: getattr(self, f"tr_2_sk_{x}").setChecked(False) if row[6] == 1: getattr(self, f"oppsk_1_sk_{x}").setChecked(True) elif row[6] == 0: getattr(self, f"oppsk_1_sk_{x}").setChecked(False) if row[7] == 1: getattr(self, f"oppsk_2_sk_{x}").setChecked(True) elif row[7] == 0: getattr(self, f"oppsk_2_sk_{x}").setChecked(False)
额外提示:
你的SQL语句存在SQL注入风险,建议改用参数化查询来修复:
get_from_db = "SELECT * FROM trening_og_oppskyting WHERE Lagnr = ? AND Skivenr = ? AND Dato = ?" c.execute(get_from_db, (lagnr, skivenr, dato))
内容的提问来源于stack exchange,提问作者Tor Harry
相关产品推荐
相关产品推荐

