我想使用循环创建一系列对象属性。具体来说,我想通过将函数列表应用于现有属性来生成“辅助”属性。
我的尝试显示在一个名为gen_secondary_properties
的函数中,如下所示。问题是所有属性都彼此相等,我不知道为什么。
def gen_secondary_properties(sefl):
prop_dict = {
's' : self.s,
'y' : self.y,
'z' : self.z,
}
func_dict = {
'real': npy.real,
'imag': npy.imag,
}
for prop_key in prop_dict:
for func_key in func_dict:
fget = lambda self: func_dict[func_key](prop_dict[prop_key])
setattr(self.__class__,'%s_%s'%(prop_key, func_key),\
property(fget))
什么工作是一个函数,它一次创建一个属性,然后从循环中调用此函数。
def __add_secondary_property(self, func , prop_name):
fget = lambda self: func(self.__getattribute__(prop_name))
setattr(self.__class__,'%s_%s'%(prop_name,func.__name__),\
property(fget))
for prop_name in ['s','z']:
for func in [npy.real, npy.imag]:
self.__add_secondary_property(func, prop_name)
答案 0 :(得分:1)
这可能是因为您在setattr()
上致电self.__class__
:__class__
由所有实例共享。如果您修改它,则为每个人修改它。试试setattr(self, ...)
或者,更改fget
的代码以在调用实例时查找实例中的值(即稍后当有人尝试读取属性时),而不是在定义getter时。您在上面的代码中执行的操作是将self.s
的当前值复制到共享的getter中(由所有实例共享)。