我有一长串的分配列表,如下所示,它们将所有局部变量复制到构造函数中的类变量中。
self.x = x
self.y = y.
....
原因是我有复杂的初始化表达式,并且我使用x
而不是self.x
来获取所有中间计算的可读性。
我试图将此块简化为类似
的内容for name in ["x","y",...]:
eval("self.%s = %s"%(name, name))
但是,我在SyntaxError
内获得eval
,是否可以更好地删除此列表?
答案 0 :(得分:0)
可以使用内置self
函数设置setattr
的属性。可以在locals()
返回的字典中按名称查找局部变量的值。
例如:
class flying_sheep:
def __init__(self):
x = 1
y = 2
for name in ['x', 'y']:
setattr( self, name, locals()[name] )
答案 1 :(得分:0)
我会使对象不可变,将计算值的关注与初始化对象的属性分开,并防止定义的属性列表与中间变量不同。换句话说,使用namedtuple和工厂函数。
trim()
如果这看起来很自以为是,那是因为它是:任何按名称处理属性的Python代码都应该以防御性方式编写。