Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有字典参数和具有默认值的类变量的类实例化_Python_Python 2.7_Dictionary - Fatal编程技术网

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,所以所有这些都可以运行,代码也可以运行。