使用类时无法访问for循环内创建的变量

丹尼尔

如果我不使用面向对象的样式,以下代码运行良好

settings = "test"
for i in range(3):
    globals()[f"var{i + 1}"] = 10 + i
    
print(settings)
print(var1)

它输出以下内容:

test
10

但是,当我在类中使用相同的代码时,它不再起作用:

class Gui():
    def __init__(self):
        self.settings = "test"
        for i in range(3):
            globals()[f"self.var{i + 1}"] = 10 + i


    def run(self):
        print(self.settings)
        print(self.var1)

gui = Gui()
gui.run()

我收到以下错误:

test
Traceback (most recent call last):
  File "C:/Users/loose/PycharmProjects/AutomatedCNNImageClassifier/python/test.py", line 14, in <module>
    gui.run()
  File "C:/Users/loose/PycharmProjects/AutomatedCNNImageClassifier/python/test.py", line 10, in run
    print(self.var1)
AttributeError: 'Gui' object has no attribute 'var1'

Process finished with exit code 1

为什么它不起作用?由于我想从另一个函数访问变量var我必须像使用self.settings一样使用self.var

神话传说

我认为您误解了全局变量的工作原理以及 self 变量的工作原理。

当您这样做时,globals()['myvariable'] = 10您将在名为的全局范围内创建一个变量myvariable并为其分配值 10。您现在可以在任何地方使用myvariablelike检索该变量print(myvariable)

但是python不支持变量.因此,如果您这样做globals()['myvariable.one']然后尝试使用myvariable.one,Python 现在正在查找名为 的变量myvariable,然后检索名为 的对象的属性one所以它不起作用。

如果你想向类中添加一个变量并通过它检索它,self.myvariable那么你会想要这样做。

class Gui():
    def __init__(self):
        self.settings = "test"
        for i in range(3):
            setattr(self, f"var{i + 1}", 10 + i)


    def run(self):
        print(self.settings)
        print(self.var1)

gui = Gui()
gui.run()

现在它将运行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章