2016-08-05 3 views
0

私は、lambdaを使ってPythonクラスで関数を定義しようとしています。クラスのインスタンスを参照したいので、どのように呼び出すことができません。Lambdaは自己を参​​照するPythonクラス

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

[lambda関数がPythonでキャプチャするものは何ですか?](http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python) – Kevin

+0

Iラムダを* 'pf.moleculeProperties'の中に割り当てると、あなたが望むスコープを得ることができると思っています。 –

答えて

2

ラムダ本体ではなく引数リストでpropertiesを評価する必要があります。これにより、早期にバインドされるようになります。だから、として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

それはそれをしました。ありがとう! –