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

更新默认字典键值后,在PyQt脚本中无法获取更新内容

问题描述

我需要在将默认字典用于另一脚本的GUI展示前,为其添加新的键值对,于是实现了MyClass类:

class MyClass:
    def __init__(self):
        self.my_dict = { 
               'dict1' : {
                   'col1' : value1,
                   'col2' : value2,
                   ...
               },
               'dict2' : {
                   'col1' : value1,
                   'col2' : value2,
               }
               ...
        }

    def set_attribute(self, dict, col, val):
        self.my_dict[dict][col] = val

    def set_attributes(self, dict, **kwargs):
        for col, val in kwargs.items():
            self.set_attribute(dict, col, val)

    def get_attribute(self, dict, col):
        if dict in self.my_dict:
            return self.my_dict[dict].get(col)
        return None

if __name__ == '__main__':
    my_obj = MyClass()
    # 注:原代码此处存在语法错误,get_attribute是MyClass的方法,不是字典的方法
    value = my_obj.get_attribute('dict', 'col1') * .011
    my_obj.set_attribute('dict1', 'col3', value)

在直接运行该类的测试代码时,更新字典添加新列的操作有效,但运行另一脚本main.py时,仅能获取默认字典内容,无法看到更新后的键值对。main.py代码如下:

from PyQt5 import QtWidgets
from dictclass import MyClass

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        print(myclass_obj.my_dict)

if __name__ == '__main__':
    import sys
    myclass_obj = MyClass()
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
原因分析
  1. 测试代码的更新仅作用于本地实例:MyClass中的if __name__ == '__main__'代码块只有在直接运行dictclass.py时才会执行,此时创建的my_obj是该脚本内的本地实例,更新操作只针对这个实例。而运行main.py时,dictclass.py是作为模块被导入的,其if __name__ == '__main__'代码块不会触发,main.py中创建的myclass_obj是全新的、未经过任何修改的MyClass实例,自然只有默认字典内容。
  2. 原测试代码存在语法错误:原代码中my_obj.my_dict.get_attribute(...)写法错误,get_attribute是MyClass类的方法,不是字典对象的方法,正确调用方式应为my_obj.get_attribute(...)。
解决方案

根据不同的需求场景,有两种常用解决方式:

方式一:在main.py中直接执行更新逻辑

如果更新操作需要和GUI流程结合,直接在main.py创建实例后执行更新:

from PyQt5 import QtWidgets
from dictclass import MyClass

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        print(myclass_obj.my_dict)

if __name__ == '__main__':
    import sys
    myclass_obj = MyClass()
    # 在这里执行字典更新操作
    value = myclass_obj.get_attribute('dict1', 'col1') * .011
    myclass_obj.set_attribute('dict1', 'col3', value)
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

方式二:在MyClass初始化时自动完成更新

如果更新逻辑是固定的,希望所有MyClass实例都带有更新后的字典,可以把更新逻辑放到__init__方法中:

class MyClass:
    def __init__(self):
        self.my_dict = { 
               'dict1' : {
                   'col1' : value1,
                   'col2' : value2,
                   ...
               },
               'dict2' : {
                   'col1' : value1,
                   'col2' : value2,
               }
               ...
        }
        # 初始化时自动执行更新
        value = self.get_attribute('dict1', 'col1') * .011
        self.set_attribute('dict1', 'col3', value)

    # 避免用dict作为参数名(它是Python内置类型),改为dict_name
    def set_attribute(self, dict_name, col, val):
        self.my_dict[dict_name][col] = val

    def set_attributes(self, dict_name, **kwargs):
        for col, val in kwargs.items():
            self.set_attribute(dict_name, col, val)

    def get_attribute(self, dict_name, col):
        if dict_name in self.my_dict:
            return self.my_dict[dict_name].get(col)
        return None

额外提示

如果需要在多个脚本间共享同一个MyClass实例的状态,可以考虑使用单例模式,或者通过参数将实例传递到GUI窗口中,确保所有操作都作用于同一个实例。

内容的提问来源于stack exchange,提问作者Willy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:32:52