将局部变量移动到对象成员

时间:2017-04-28 15:10:59

标签: python-3.x

我有一长串的分配列表,如下所示,它们将所有局部变量复制到构造函数中的类变量中。

self.x = x
self.y = y.
....

原因是我有复杂的初始化表达式,并且我使用x而不是self.x来获取所有中间计算的可读性。

我试图将此块简化为类似

的内容
for name in ["x","y",...]:
  eval("self.%s = %s"%(name, name))

但是,我在SyntaxError内获得eval,是否可以更好地删除此列表?

2 个答案:

答案 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代码都应该以防御性方式编写。