具有字典参数的类实例化和具有默认值的类变量

时间:2015-04-24 18:13:36

标签: python python-2.7 dictionary

我有一个类__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]

2 个答案:

答案 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.getdict_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