Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
使用不同的**kwargs字典实例化类对象-python_Python_Oop_Dictionary_Init_Keyword Argument - Fatal编程技术网

使用不同的**kwargs字典实例化类对象-python

使用不同的**kwargs字典实例化类对象-python,python,oop,dictionary,init,keyword-argument,Python,Oop,Dictionary,Init,Keyword Argument,因此,我目前正在将我的非面向对象python代码转换为面向对象的设计。这是我的文件的一个示例 [object1] # this only has keys 1, 2 and 3 key1: "value 1" key2: "value 2" key3: "value 3" [object2] # this only has keys 1, 2 and 4 key1: "different value 1" key2: "different value 2" key4: "value 4" [

因此,我目前正在将我的非面向对象python代码转换为面向对象的设计。这是我的文件的一个示例

[object1] # this only has keys 1, 2 and 3
key1: "value 1"
key2: "value 2"
key3: "value 3"

[object2] # this only has keys 1, 2 and 4
key1: "different value 1"
key2: "different value 2"
key4: "value 4"

[object3] # this has all possible keys 1, 2, 3, 4, 5
key1: "another different value 1"
key2: "another different value 2"
key3: "different value 3"
key4: "different value 4"
key5: "value 5"
我对此进行解析,以便在字典中为每个(此时未创建的)对象创建键:值对。因此,对于这三个对象,我的所有可能键列表和字典键列表如下所示:(伪代码)

正如您所看到的,每个字典可能有所有可能的键,或者只有几个键,等等(但值仍然不同)。当我创建一个新的类对象时,我传入特定的字典。我想将在该字典中找到的键初始化为它们各自的值…如果该键不在字典中(例如dictionary2没有“key3”或“key5”),则不会创建该属性。这就是我在这里想的方法:

Class MyClass( object ):
    def __init__(self, **kwargs):
    possibleKeys = ['key1', 'key2', 'key3', 'key4', 'key5']
    for key in kwargs.keys():
        if key in possibleKeys:
            # create attribute for this instance using the key:value pair
        else:
            # don't create the attribute, but also don't have a default blank value

dictionary = {'key1': 'different value 1', 'key2': 'different value 2', 'key4': 'value 4'}
newObject = MyClass(**dictionary)
我试图通过将所有可能的属性设置为默认值(“”、[]或False)来避免AttributeError,然后仅在字典中存在键时替换这些默认值。这给了我我想要的…但是对于一些对象,我只有一个或两个属性,其余的都是空的/默认的,我不希望一堆不需要的占位符占据这个对象中的空间

这是最好的方法吗?我也看过setattr之类的东西,但我不确定所有东西是如何联系在一起的(init),如果属性出现在**kwargs中,则设置属性

谢谢大家。我希望我说得够清楚了

编辑 我用了这个,它似乎工作,但我将不得不测试它,并确保它正在做我需要的

class MyClass( object ):
def __init__(self, **kwargs):
    self.__dict__.update(kwargs)


# method to produce dictionary for specified term/object

newObject = MyClass(**dictionary)
print newObject.<key>
类MyClass(对象):
定义初始(自我,**kwargs):
自我记录更新(kwargs)
#方法为指定的术语/对象生成字典
newObject=MyClass(**字典)
打印新对象。

self.\uuuu dict\uuuuuuuuuuuuuu.update(kwargs)
应该可以很好地为您工作。只是一个想法:您是否考虑过直接将字典存储为属性并重载
\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuu setitem\uuuuuuuuuu
。关于将对象视为dict的更多信息:我还没有对此进行研究。在访问键/值时,除了语法之外还有什么好处?对于进一步的细粒度控制,我推荐David Beazley关于Python元编程的精彩演讲:一些好处:您可以使用自定义对象完成所有可以使用的事情h一个普通的dict,比如遍历键,
update
,诸如此类的东西。
class MyClass( object ):
def __init__(self, **kwargs):
    self.__dict__.update(kwargs)


# method to produce dictionary for specified term/object

newObject = MyClass(**dictionary)
print newObject.<key>