我想使用循环和setattr
函数创建对象属性。
我遇到的问题是使用这样的循环创建的所有属性彼此相等。
在以下示例中,我创建了一个具有单个属性A
的类z
,这是一个复数。然后我想循环遍历numpy的real
和imag
等函数来创建其他属性,例如z_real
和z_imag
。在此示例的上下文中,问题是z_real == z_imag
是True
。
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 :(得分:1)
答案 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)
等