2016-08-05 25 views
0

我想在使用lambda的Python類中定義一個函數,我想引用它從中被調用的類的實例,並且不知道如何。在Python類中提到自我的Lambda

properties.append(pf.moleculeProperties()) 
properties[-1].name = "Monatomic Hydrogen" 
properties[-1].formula = "H" 
properties[-1].mass = (1.00795e-3)/(6.022e23) 
properties[-1].elecLevels = [[pf.waveNumToJoules(82309.58), 1]] 
properties[-1].q = lambda T,V : pf.q_trans(properties[-1],T,V) * pf.q_elec(properties[-1],T,V) 

properties.append(pf.moleculeProperties()) 
properties[-1].name = "Monatomic Oxygen" 
properties[-1].formula = "O" 
properties[-1].mass = (16.0e-3)/(6.022e23) 
properties[-1].elecLevels = [[pf.waveNumToJoules(158.265), 1], [pf.waveNumToJoules(226.977), 1], [pf.waveNumToJoules(15867.862), 1], 
      [pf.waveNumToJoules(33792.583), 1], [pf.waveNumToJoules(73768.200), 1], [pf.waveNumToJoules(76794.978), 1], [pf.waveNumToJoules(86625.757), 1]] 
properties[-1].q = lambda T,V : pf.q_trans(properties[-1],T,V) * pf.q_elec(properties[-1],T,V) 

當我嘗試調用上比列表的最後一個成員以外的東西Q,它似乎評估性能[-1]的語句,每次給我的名單的最後一個成員。在這個例子中,我試圖調用與氫對應的元素的q函數並獲得氧的q函數。

+1

[Python中的(lambda)函數閉包捕獲是什麼?](http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python) – Kevin

+0

I如果你在* pf.moleculeProperties裏指定lambda *,你就可以得到你想要的範圍。 –

回答

2

您需要在參數列表中評估properties而不是lambda的主體,以便它早期綁定。因此,定義q爲:

properties[-1].q = lambda T,V,self=properties[-1] : pf.q_trans(self,T,V) * pf.q_elec(self,T,V) 

當你做到以上,分配給self計算一次,併成爲永久綁定到拉姆達。否則,properties將引用父上下文(就像你發現的那樣)。

+0

這樣做。謝謝! –