如果我不使用面向对象的样式,以下代码运行良好
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。您现在可以在任何地方使用myvariable
like检索该变量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] 删除。
我来说两句