Python 具有字典参数和具有默认值的类变量的类实例化
我有一个类,它的Python 具有字典参数和具有默认值的类变量的类实例化,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有一个类,它的\uuuu init\uuu()接受字典参数。此字典中的每个键对应一个实例变量。如果我们在不使用部分或全部字典键的情况下创建此对象,则实例变量具有默认值。我将其编码如下: class MyClass: def __init__(self, param1, dict_param): self.param1 = param1 if 'key1' in dict_param: self.key1 = dict_param[
\uuuu init\uuu()
接受字典参数。此字典中的每个键对应一个实例变量。如果我们在不使用部分或全部字典键的情况下创建此对象,则实例变量具有默认值。我将其编码如下:
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]
像这样:
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\u param
中获取值(如果存在),或者如果dict\u param
中未提供值,则使用default\u vals
中的值。此外,根据默认值的来源,您可以在类级别(即,在类外部但在类内部)或在模块中全局定义default\u vals
请注意,这里没有任何类变量。您有实例变量。如下所示:
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\u param
中获取值(如果存在),或者如果dict\u param
中未提供值,则使用default\u vals
中的值。此外,根据默认值的来源,您可以在类级别(即,在类外部但在类内部)或在模块中全局定义default\u vals
请注意,这里没有任何类变量。您有实例变量。另一种选择-在这里,
\uuuuu init\uuuu
不接受dict
,但您可以通过关键字参数向其发送字典
另一种选择是,
\uuuuu init\uuuu
不接受dict
,但您可以通过关键字参数向其发送字典
+1.如果要将键/值作为关键字参数传递,也可以使用
**kwargs
而不是dict_param
。在第二个代码块中,“default_vals=”不是“self.default_vals=”,因为在使用setattr(self)之后,@Scott:No.setattr
将设置单个属性(key1、key2等)在self
上,您可以使用self.default\u vals=…
但是您必须使用self.default\u vals.iteritems()
稍后。此外,这将在每个实例上存储默认值dict,以及该实例自身的各个属性值,这将造成一点混乱。@BrenBarn我喜欢你提出的第二种方法,但它会给我一堆未解析的属性引用。我的代码运行是因为有默认值或字典是我传入的。我应该不关心未解析的属性,还是应该将它们设置为“无”?@BrenBarn这是ide(PyCharm)让我知道可能存在的问题。因为我没有在_init__()中明确命名self.key1ide突出显示了我使用self.key1的所有地方。由于您的解决方案具有默认值或dict_-param-feed-self,所以一切都会正常工作,代码也会运行。+1.如果您想将键/值作为关键字参数传递,您还可以使用**kwargs
而不是dict_-param
。在第二个代码块中,将使用“default_-vals=”n不要使用“self.default\u vals=”,因为在您使用setattr(self)之后,@Scott:No.setattr
将在self
上设置单个属性(key1、key2等)。您可以使用self.default\u vals=…
但是您必须使用self.default\u vals.iteritems()
稍后。此外,这将在每个实例上存储默认值dict,以及该实例自身的各个属性值,这将造成一点混乱。@BrenBarn我喜欢你提出的第二种方法,但它会给我一堆未解析的属性引用。我的代码运行是因为有默认值或字典是我传入的。我应该不关心未解析的属性,还是应该将它们设置为“无”?@BrenBarn这是ide(PyCharm)让我知道可能存在的问题。因为我没有在_init__()中明确命名self.key1ide突出显示了我使用self.key1的所有地方。因为您的解决方案具有默认值或dict_param feeding self,所以所有这些都可以运行,代码也可以运行。