You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()函数来动态获取类实例的属性,之后再调用对应的方法。

具体改造步骤:

  1. 处理空结果的分支:
    把原来的固定属性调用改成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()
  1. 处理有结果的分支:
    同样用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:20:33