問題
我要做到以下幾點:設置屬性編程
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
但是這個計劃的事實,A
,B
和C
是性能挫敗。
類似於LISP的宏在這裏將會是一個巨大的幫助,不幸的是Python似乎不支持宏,我也不想添加依賴關係到我在線發現的Python宏庫之一(我沒有因爲無論如何我都無法使用它們)。
我也想避免在列表中使用匿名函數,因爲這可能會導致與第二個代碼清單中相同的代碼量。
我的最後一招解決這個問題目前是eval
s,我不惜一切代價避免這個問題。
爲什麼不使用lambda函數? –
@Peter Kirby:我的目標是減少代碼量,而不是將其轉換爲不同的形式。在我誤解的情況下,請澄清。 – user1624579
我誤解了,對不起。但是,Martjin的回答是正確的,並且應該工作。 –