在一行代码中设置所有类成员变量

时间:2017-07-28 09:29:36

标签: python python-2.7

我有一个包含几个成员变量的类,我在构造时初始化:

class MyClass():
    def __init__(self,var1,var2,var3,var4,var5,var6,var7,var8):
        self.var1 = var1
        self.var2 = var2
        self.var3 = var3
        self.var4 = var4
        self.var5 = var5
        self.var6 = var6
        self.var7 = var7
        self.var8 = var8

是否有任何pythonic方法可以在一行代码中执行此操作?

我尝试使用eval,但当然没有成功:

class MyClass():
    def __init__(self,var1,var2,var3,var4,var5,var6,var7,var8):
        for var in 'var1,var2,var3,var4,var5,var6,var7,var8'.split(','):
            eval('self.'+var+'='+var)

谢谢。

2 个答案:

答案 0 :(得分:7)

def __init__(self, **kwargs):
    for k, v in kwargs.items():
        setattr(self, k, v)

缺点是你现在可以将任何东西和所有东西都作为属性传递,并且记录得很糟。

答案 1 :(得分:1)

x = 1

class MyClass(object):
    def __init__(self, var1, var2, var3, var4, var5, var6, var7, var8):
        self.__dict__.update(locals())
        del self.self
        y = 3

c = MyClass(2, 3, 4, 5, 6, 7, 8, 9)
for var in 'var1 var2 var3 x y self'.split():
    print var, ':', getattr(c, var, 'not present')

输出:

var1 : 2
var2 : 3
var3 : 4
x : not present
y : not present
self : not present

这是一个黑客。一些缺点:

  1. 如果您在非顶级范围内(即在函数内)定义MyClass,或者self.__dict__.update(locals())不是__init__中的第一行,您可以得到不需要的变量。
  2. 这种或任何其他神奇的解决方案都会弄乱短语(例如PyCharm)。
  3. 这会绕过特殊属性设置挂钩,例如属性或__setattr__。在这种情况下,您可以使用更像deceze的解决方案:
  4. class MyClass(object):
        def __init__(self, var1, prop):
            for k, v in locals().items():
                setattr(self, k, v)
            del self.self
    
        @property
        def prop(self):
            return self._prop
    
        @prop.setter
        def prop(self, val):
            self._prop = val
    
    c = MyClass(2, 3)
    print c.var1, c.prop, c._prop  # 2 3 3