2012-03-04 9 views
1

ループを使用してオブジェクトプロパティを作成し、setattr関数を作成したいとします。 私が遭遇する問題は、そのようなループで作成されたすべてのプロパティが互いに等しいということです。ループでプロパティを作成する

次の例では、複素数であるzという単一の属性を持つクラスAを作成します。私はnum37のrealimagのような関数をループして、z_realz_imagのような他のプロパティを作成したいと思っています。この場合、この例の文脈では、z_real == z_imagTrueです。これを実行している

import numpy as np 

class A(object): 
    def __init__(self, z): 
     self.z = z 

     for func in [np.real, np.imag]: 
      fget = lambda x: func(x.z) 
      print('self.z_%s = %i' % (func.__name__, fget(self))) 
      setattr(self.__class__, 'z_%s' % (func.__name__), 
        property(fget)) 


a = A(1+2j) 

print ('a.z_real=%i'% a.z_real) 
print ('a.z_imag=%i'% a.z_imag) 

self.z_real = 1 
self.z_imag = 2 
a.z_real=2  
a.z_imag=2 

をもたらし、これはなぜそれが私には明確ではありません。

+0

私は、このように多くのプロパティを作成したいので。 – alex

答えて

1

You're doing it wrong.

正常な機能ごとに同じ閉鎖の1つのインスタンス、より多くを作成しないでください!あなたのfget

fget = lambda x, f=func: f(x.z) 
+0

ありがとう!私はそのリンクを拾い読みし、その問題についてはっきりとしていないが、コメントには実際に合理的な議論がある。可変スコープを使いこなすことで特徴づけることができますか? funcはラムダ関数で使用されたが、渡されなかったためです。 – alex

+0

スコープに関する問題は*厳密に*問題です。 –

+0

この閉鎖の問題に関する2つのリンクがあります:http://utcc.utoronto.ca/~cks/space/blog/python/WhatClosuresCloseとhttp://utcc.utoronto.ca/~cks/space/blog/ Python/CPythonCellsClosuresです。 – EOL

1

閉鎖です。それは変数funcで終了しました。ループが終了した後、funcnp.imagのままになります。

あなたはself.z = zのafer次の操作を行う必要があります。

def make_getter(func): 
    return lambda x: func(x.z) 

for func in [np.real, np.imag]: 
    fget = make_getter(func) 

など

+0

はい、それは私の周りの仕事でしたが、私はなぜ私の元の方法のdintが今まで働くのか分かりませんでした。 – alex

関連する問題