我有一个类__init__()
采用字典参数。此字典中的每个键对应一个实例变量。如果我们创建此对象而没有部分或全部字典键,则实例变量具有默认值。我这样编码:
class MyClass:
def __init__(self, param1, dict_param):
self.param1 = param1
if 'key1' in dict_param:
self.key1 = dict_param['key1']
else:
self.key1 = 10.0 # some default value
# possibly more instance variable / dictionary key assignments
所以这很好用,但实际上我有8个这样的字典键/类变量赋值和8个默认值。
如何循环我的字典键并将它们分配给实例变量?我正在寻找类似的东西:
class MyClass:
def __init__(self, param1, dict_param):
self.param1 = param1
self.key1 = 10.0 # set default value
# more defaults...
for key in dict_param.keys():
if object has class_variable key:
assign class_variable param[key]
答案 0 :(得分:4)
像这样:
def __init__(self, param1, dict_param):
self.param1 = param1
self.key1 = 10.0 # set default value
# more defaults...
for key, value in dict_param.iteritems():
if hasattr(self, key):
setattr(self, key, value)
您还可以创建默认值的字典并使用:
def __init__(self, param1, dict_param):
self.param1 = param1
default_vals = {
'key1': 'default 1',
'key2': 'default 2',
'etc': 'and so on'
}
for key, value in default_vals.iteritems():
setattr(self, key, dict_param.get(key, value))
此方法允许您使用dict.get
从dict_param
获取值(如果存在),或者如果default_vals
中未提供值,则使用dict_param
中的值。此外,根据默认值的来源,您可以在类级别(即default_vals
之外但在类中)或模块中全局定义__init__
。
请注意,此处没有任何类变量。你有实例变量。
答案 1 :(得分:1)
另一种选择 - 此处__init__
不会使用dict
,但您可以在关键字参数中向其发送字典。
>>> class A(object):
... def __init__(self, key1=10.0, key2=5):
... self.key1 = key1
... self.key2 = key2
...
>>> a = A(**{'key2': 3})
>>> a.key1
10.0
>>> a.key2
3