从字典中创build类实例属性?

我从CSV导入并获取大致格式的数据

{ 'Field1' : 3000, 'Field2' : 6000, 'RandomField' : 5000 } 

这些字段的名称是dynamic的。 (好吧,它们是dynamic的,可能比Field1和Field2多,但是我知道Field1Field2总是在那里。

我想能够将这个字典传入我的类allMyFields以便我可以访问上述数据作为属性。

 class allMyFields: # I think I need to include these to allow hinting in Komodo. I think. self.Field1 = None self.Field2 = None def __init__(self,dictionary): for k,v in dictionary.items(): self.k = v #of course, this doesn't work. I've ended up doing this instead #self.data[k] = v #but it's not the way I want to access the data. q = { 'Field1' : 3000, 'Field2' : 6000, 'RandomField' : 5000 } instance = allMyFields(q) # Ideally I could do this. print q.Field1 

有什么build议么? 至于为什么 – 我想能够利用代码提示,并将数据导入到一个名为data的字典中,因为我一直在做这些工作,所以我不能承受这些。

(因为variables名直到运行self.Field1 = None被parsing,所以我仍然不得不向Komodo扔骨头 – 我认为self.Field1 = None就足够了。)

所以 – 我怎么做我想要的? 还是我吠叫一个devise不好的非蟒树?

你可以使用setattr (但要小心:不是每个string都是一个有效的属性名称):

 >>> class AllMyFields: ... def __init__(self, dictionary): ... for k, v in dictionary.items(): ... setattr(self, k, v) ... >>> o = AllMyFields({'a': 1, 'b': 2}) >>> oa 1 

编辑:让我解释一下上面的代码和SilentGhost的答案之间的区别。 上面的代码片段创build了一个实例属性基于给定字典的类。 SilentGhost的代码创build一个类,其类属性基于给定的字典。

根据您的具体情况,这些解决scheme可能更合适。 你明白创build一个或多个类实例吗? 如果答案是一个,那么您可以完全跳过对象创build,只构造types(因此可以使用SilentGhost的答案)。

 >>> q = { 'Field1' : 3000, 'Field2' : 6000, 'RandomField' : 5000 } >>> q = type('allMyFields', (object,), q) >>> q.Field1 3000 

type docs很好的解释了这里的情况(请参阅用作构造函数)。

编辑 :如果你需要实例variables,下面的工作:

 >>> a = q() # first instance >>> a.Field1 3000 >>> a.Field1 = 1 >>> a.Field1 1 >>> q().Field1 # second instance 3000 

您也可以使用dict.update而不是手动循环items (如果循环, iteritems更好)。

 class allMyFields(object): # note: you cannot (and don't have to) use self here Field1 = None Field2 = None def __init__(self, dictionary): self.__dict__.update(dictionary) q = { 'Field1' : 3000, 'Field2' : 6000, 'RandomField' : 5000 } instance = allMyFields(q) print instance.Field1 # => 3000 print instance.Field2 # => 6000 print instance.RandomField # => 5000 

使用命名元组(Python 2.6):

 >>> from collections import namedtuple >>> the_dict = {'Field1': 3, 'Field2': 'b', 'foo': 4.9} >>> fields = ' '.join(the_dict.keys()) >>> AllMyFields = namedtuple('AllMyFields', fields) >>> instance = AllMyFields(**the_dict) >>> print instance.Field1, instance.Field2, instance.foo 3 b 4.9 

你可以做一个dict的子类,它允许键的属性查找:

 class AttributeDict(dict): def __getattr__(self, name): return self[name] q = AttributeDict({ 'Field1' : 3000, 'Field2' : 6000, 'RandomField' : 5000 }) print q.Field1 print q.Field2 print q.RandomField 

如果你试图查找一个已经存在的属性(比如keys或者get ),你将得到那个dict类的属性(一个方法)。 如果您要求的密钥在dict类中不存在,则__getattr__方法将被调用,并将执行您的密钥查找。

用漂亮的方式使用setattr。 quick-n-dirty方法是更新实例内部字典:

 >>> class A(object): ... pass ... >>> a = A() >>> a.__dict__.update({"foo": 1, "bar": 2}) >>> a.foo 1 >>> a.bar 2 >>>