2012-08-25 108 views
2

問題

我要做到以下幾點:設置屬性編程

tmp = do_stuff(tmp2) 
if tmp != None: 
    num = tmp 

但是這些變量在我的問題被分配是變量:一個對象實例的(更好的性能):

class mycls(object): 
    def __init__(self): 
     self.__a, self._b, self.c = 2, 3, 5 
    def set_a(self, val): self.__a = val 
    def set_b(self, val): self._b = val 
    def set_c(self, val): self.c = val 
    A = property(fset = set_a) 
    B = property(fset = set_b) 
    C = property(fset = set_c) 
tmp2 = [7, 11, 13] 
inst = mycls() 
tmp = do_stuff(tmp2[0]) 
if tmp != None: inst.A = tmp 
tmp = do_stuff(tmp2[1]) 
if tmp != None: inst.B = tmp 
tmp = do_stuff(tmp2[2]) 
if tmp != None: inst.C = tmp 

顯然,最後一部分看起來高度重複,在我的情況下需要應用於超過10個變量。我現在的問題是:如何壓縮最後6行?在解決這個問題

自己嘗試

理想我寧願像一個解決方案:

for i in [[inst.A, 0], [inst.B, 1], [inst.C, 2]]: 
    tmp = do_stuff(tmp2[i[1]]) 
    if tmp != None: i[0] = tmp 

但是這不起作用(因爲inst.X進行評估,並不能存儲基本數據類型通過引用/指針)。我想出的另一種方法是使用變量名作爲字符串並用inst.__dict__(例如像這樣:

for i in [["A", 0], ["B", 1], ["C", 2]]: 
    tmp = do_stuff(tmp2[i[1]]) 
    if tmp != None: inst.__dict__[i[0]] = tmp 

但是這個計劃的事實,ABC是性能挫敗。

類似於LISP的宏在這裏將會是一個巨大的幫助,不幸的是Python似乎不支持宏,我也不想添加依賴關係到我在線發現的Python宏庫之一(我沒有因爲無論如何我都無法使用它們)。

我也想避免在列表中使用匿名函數,因爲這可能會導致與第二個代碼清單中相同的代碼量。

我的最後一招解決這個問題目前是eval s,我不惜一切代價避免這個問題。

+0

爲什麼不使用lambda函數? –

+0

@Peter Kirby:我的目標是減少代碼量,而不是將其轉換爲不同的形式。在我誤解的情況下,請澄清。 – user1624579

+0

我誤解了,對不起。但是,Martjin的回答是正確的,並且應該工作。 –

回答

6

您正在尋找setattr()

for i in [["A", 0], ["B", 1], ["C", 2]]: 
    tmp = do_stuff(tmp2[i[1]]) 
    if tmp != None: setattr(inst, i[0], tmp) 

引述文件:

這是getattr()對方。參數是一個對象,一個字符串和一個任意值。該字符串可以命名現有的屬性或新的屬性。如果該對象允許,該函數將該值分配給該屬性。例如,setattr(x, 'foobar', 123)相當於x.foobar = 123

注意,由於None是在python一個單,通常是一個試驗使用isis not運營它:

for i in [["A", 0], ["B", 1], ["C", 2]]: 
    tmp = do_stuff(tmp2[i[1]]) 
    if tmp is not None: 
     setattr(inst, i[0], tmp) 

PEP 8 python styleguide阻礙複合語句;將if套件保留在它自己的行上,即使它只是一行。

+0

非常感謝。這確實有訣竅。 – user1624579

+0

考慮有關縮進的styleguide註釋:在編寫示例代碼時,我儘量保持它儘可能短。雖然PEP 8中的陳述在程序和項目中肯定會有所幫助,但我認爲這些準則不適用於最低限度的示例代碼。 – user1624579

+0

那麼,在一個3或4線的例子是不會有太大的可能性;我發現清晰的縮進更具可讀性,並且使用示例代碼來實現最大的可讀性。 :-) –