【问题标题】:Moving local variables into object members将局部变量移动到对象成员中
【发布时间】:2017-04-28 15:10:59
【问题描述】:

我有一长串赋值,如下所示,它将所有局部变量复制到构造函数中的类变量中。

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

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

我试图将这个块简化为类似

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

但是,我在eval 中添加了SyntaxError,他们是减少此列表的更好方法吗?

【问题讨论】:

标签: python-3.x


【解决方案1】:

我会让对象不可变,将计算值的关注与初始化对象的属性分开,并防止定义的属性列表与中间变量不同。换句话说,使用 namedtuple 和工厂函数。

>>> import collections
>>> class Thing(collections.namedtuple('Thing', ['x', 'y'])):
    pass

>>> def create_thing():
        x = 42
        y = 24
        return Thing(**locals())

>>> create_thing()
Thing(x=42, y=24)

如果这看起来固执己见,那是因为它是:任何按名称处理属性的 Python 代码都应该防御性地编写。

【讨论】:

    【解决方案2】:

    self 的属性可以使用内置的setattr 函数进行设置。局部变量的值可以在locals()返回的字典中按名称查找。

    例如:

    class flying_sheep:
        def __init__(self):
    
            x = 1
            y = 2
    
            for name in ['x', 'y']:
                setattr( self, name, locals()[name] )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多