用循环创建属性

时间:2012-03-04 00:13:25

标签: python

我想使用循环和setattr函数创建对象属性。 我遇到的问题是使用这样的循环创建的所有属性彼此相等。

在以下示例中,我创建了一个具有单个属性A的类z,这是一个复数。然后我想循环遍历numpy的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

我不清楚为什么会这样。

2 个答案:

答案 0 :(得分:1)

You're doing it wrong.

  

每个普通函数不要创建多个相同闭包的实例!

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

答案 1 :(得分:1)

您的fget关闭。它关闭了变量func。循环结束后,func仍设置为np.imag

您应该在self.z = z之后执行以下操作:

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

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