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

Python 使用类时无法访问为循环内部创建的变量,python,Python,如果我不使用面向对象的样式,下面的代码运行良好 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.settin

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

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引用实例,但在您的示例中,您正在全局定义变量self.var1。 因此它不绑定到类上下文

因此出现错误消息的原因。 你班上真的没有var1

您可以自己尝试,在类中为self.var1指定一个特定值,然后运行它。
您将能够检索指定的值。

我认为您误解了全局变量的工作方式和自变量的工作方式

当您执行globals['myvariable']=10时,您将在全局范围内创建一个名为myvariable的变量,并将其赋值为10。现在,您可以使用myvariable(如printmyvariable)在任何地方检索该变量

但是,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()

现在它将运行。

您所做的就是直接在globals字典上定义globals['self.var1']等。这段代码真的很难闻,你为什么要这么做而不是仅仅使用一个列表呢?请注意,自我并没有什么特别之处。在fself.var{i+1}中。你可以很容易地写出fI,比如煎饼var{i+1}。你根本不用局部变量self。