2014-09-06 82 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

相關問題