Python:对象方法无法查看其他方法对 self.variable 所做的更改

Python: Object method cannot see changes to a self.variable made by another method

提问人:Ash Hekmat 提问时间:3/9/2023 最后编辑:Ash Hekmat 更新时间:3/9/2023 访问量:57

问:

我有两个函数处理相同的数据,所以我认为创建一个类是有意义的。但是我无法从第二个方法中看到在第一种方法中对 self.variable 所做的更改。

class Settings:
    def __init__(self):
        self.settings_to_change = {}

    def get_default(self, **kwargs):   
        self.settings_to_change.update('setting': True})
        log(f'Settings to be changed: {self.settings_to_change})
        
    def set_default(self, **kwargs):
        log(f'Settings to be changed: {self.settings_to_change})


settings = Settings()

settings.get_default()
# output: Settings to be changed: {'setting': True}

settings.set_default()
# output: Settings to be changed: {} 

我以为用自己。对于变量,并在创建对象时初始化它意味着我可以在一个对象方法中更新变量,然后在第二个对象方法中查看更新。但它似乎恢复到初始化值。

我不确定这是否与我的对象被调用的方式有关。

我有一个可以根据命令运行 python 脚本的应用程序。

首先,当设置窗口打开时:RunScript(script.py,action=settings.get_default)

然后是这样的:script.py

from resources.lib.script.actions import *
from resources.lib.script.settings import Settings
from resources.lib.utilities import *


class Main:
    def __init__(self, *args):
        settings = Settings()
        try:
            self.params = dict(arg.split('=', 1) for arg in args)
        except:
            self.params = {}
        function = eval(self.params['action'])
        function(**self.params)


if __name__ == '__main__':
    Main(*sys.argv[1:])

第一次执行工作正常,但是当设置窗口关闭时,它会调用: 这时我在日志中看到self.settings_to_change看起来是空的。RunScript(script.py,action=settings.set_default)

Python 继承 方法 scope variable-assignment

评论

0赞 Tim Roberts 3/9/2023
您的脚本在您可能想要的两个地方有 .这些代码中真的有错别字吗?settings_to_changeself.settings_to_change
1赞 Tim Roberts 3/9/2023
等一会。如果每次都启动一个新的 Python 副本,那么显然您必须了解这些实例是完全不相关的。进程之间没有对象共享。RunScript
0赞 Ash Hekmat 3/9/2023
谢谢蒂姆·罗伯茨(Tim Roberts)-很抱歉,在简化共享代码时,我不小心删除了自己。我已经把它们编辑回来了。你的第二点可能是,我不确定说实话,因为这是我的第一个编码项目,但会尝试沿着这些思路进行调查。如果是这种情况,我想有一个类并没有真正的帮助,我需要将我需要的输出保存在其他地方,例如文件。

答:

0赞 Shorn 3/9/2023 #1

您每次都需要指定 self,否则它将查找局部范围变量。

class Settings:
    def __init__(self):
        self.settings_to_change = {}

    def get_default(self, **kwargs):   
        self.settings_to_change.update({'setting': True})
        print(f'Settings to be changed: {self.settings_to_change}')
        
    def set_default(self, **kwargs):
        print(f'Settings to be changed: {self.settings_to_change}')


settings = Settings()

settings.get_default()
# output: Settings to be changed: {'setting': True}

settings.set_default()
# output: Settings to be changed: {} 

#output
Settings to be changed: {'setting': True}
Settings to be changed: {'setting': True}

顺便说一句,为什么你的设置和你得到?get_defaultset_default

评论

0赞 Ash Hekmat 3/9/2023
感谢您的回复 Shorn - 对不起,我在简化代码以在此处共享时不小心删除了自我。我重新添加了它们,可以确认我的问题仍然存在,但 Tim Roberts 建议这可能是由于我运行脚本的方式,这些方法没有在共享实例中调用。
0赞 Ash Hekmat 3/9/2023
对于您的第二个问题,我在“get_default”中更新的字典是与建议设置不匹配的设置值列表。我希望能够将其传递给我的set_settings方法,因此我只覆盖了正确的设置。这是我让用户选择并应用推荐的设置配置文件的方法。