2014-09-06 81 views
1

我有一个字符串:`Python 3 getattr字符串来命名它为什么不好?

( “位” + STR(loopCount)))`

loopcount只是一个数字,我在一个循环递增。

我想那是创建一些qtwidget这样做的:

self.Bit1 = QtGui.QLineEdit(self) 
self.Bit2 = QtGui.QLineEdit(self) 
self.Bit3 = QtGui.QLineEdit(self) 

...等多达我​​在LoopCount。

为此,我需要将我的字符串转换为名称。通过在网上查找,我发现了这个getattr,这似乎是最容易的方法: BitNmb在范围内(0,self.mySpnValue): getattr(self,(“Bit”+ str(loopCount)))

这给我这个错误: AttributeError的:“等级2”对象有没有属性“位1” 这是相当令人沮丧,因为我可以在我得到错误看到了我想要的“第1位”,但我没有一个线索为什么它想成为我班的一个属性。 没办法做简单

getattr(self, ("Bit" + str(loopCount))) = QtGui.QLineEdit(self) 

error : SyntaxError: can't assign to function call 

我看了很多时候“不GETATTR我们使用字典” OK ......但是为什么呢?使用字典听起来像很多工作只是为了做这么简单的事情?

谢谢

+2

'setattr'做你想要做的事。但实际上,只是使用一个列表:'self.bits = [QtGui.QLineEdit(self)for _ in range(loop_count)]' – roippi 2014-09-06 18:11:17

+0

我刚刚明白了为什么我得到这个错误,这是因为“self”... arg 。 感谢列表的例子,但我真的不明白它,我不是特别新的编码,但self.bits = [QtGui.QLineEdit(self)for _ in range(loop_count)]不会让很多sens对我来说。如果我正在做这样的事情,我会发现自己有几个相同的self.bits,这似乎不可能。 (?) – 2014-09-06 18:15:43

回答

2

而不是创建单独的编号属性,使用列表或字典。在这种情况下,列表会做得很好:

self.bits = [QtGui.QLineEdit(self) for _ in range(3)] 

创建3个QLineEdit对象的列表。

动态属性,你会使用setattr() function

setattr(self, 'Bit{}'.format(loopCount), QtGui.QLineEdit(self)) 
+0

我明白了,得心应手。非常感谢:) – 2014-09-06 18:25:08

+0

但是当我想使用列表: 在范围(0,self.mySpnValue)中的BitNmb时出错: self.vbox2.addWidget(self.bits [loopCount] -1) TypeError:不支持的操作数类型为 - :'QLineEdit'和'int' 所以我仔细看了看,这是什么包含我的列表: 这是我的桂是,但不selfBits1 ... self.vbox2.addWidget(SETATTR(自我, '位{}' 格式(loopCount),QtGui.QLineEdit(个体经营)))返回我一个错误: QLayout:不能为空小工具添加到QVBoxLayout/ 我对这个列表方法有点迷茫,为什么使用getattr如此糟糕? – 2014-09-06 19:03:55

+0

您正试图从'QLineEdit'对象中减去1:'self.bits [loopCount] -1'。也许你想在索引表达式中加入' - 1'*? – 2014-09-06 19:10:22

相关问题