我有一个包含几个成员变量的类,我在构造时初始化:
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)
谢谢。
答案 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
这是一个黑客。一些缺点:
MyClass
,或者self.__dict__.update(locals())
不是__init__
中的第一行,您可以得到不需要的变量。__setattr__
。在这种情况下,您可以使用更像deceze的解决方案: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