2010-10-07 5 views
3
site = object() 
mydict = {'name': 'My Site', 'location': 'Zhengjiang'} 
for key, value in mydict.iteritems(): 
    setattr(site, key, value) 
print site.a # it doesn't work 

Le code ci-dessus ne fonctionne pas. Toute suggestion?Ajout de la propriété dynamique à un objet python

+0

il serait utile quand vous dites quelque chose ne fonctionne pas, pour donner un peu plus d'informations comme ce que vous vouliez arriver, et/ou des exceptions levées, etc – dtlussier

Répondre

7

La meilleure façon de renseigner un dict avec un autre est the update() method, donc si vous étendez object pour assurer votre objet a un __dict__ vous pouvez essayer quelque chose comme ceci:

>>> class Site(object): 
...  pass 
... 
>>> site = Site() 
>>> site.__dict__.update(dict) 
>>> site.a 

Ou peut-être même:

>>> class Site(object): 
...  def __init__(self,dict): 
...   self.__dict__.update(dict) 
... 
>>> site = Site(dict) 
>>> site.a 
1
class site(object): 
    pass 
for k,v in dict.iteritems(): 
    setattr(site,k,v) 
print site.a #it does works 
+0

objet 'objet' n'a pas d'attribut '__dict__' – mlzboy

+0

votre solution peut finir par être plus confus à l'affiche originale. Dans leur code d'origine, ils veulent ajouter des attributs à un objet qui est une instance de 'object'. Cependant, vous offrez une solution qui ajoute des attributs à la classe 'site'. Je reconnais que cela fonctionne, mais peut-être pas ce qu'ils avaient en tête. – dtlussier

+0

solution acceptée fait la même chose, car l'ajout d'un attribut à une instance 'object' n'est pas possible – leoluk

6

As docs say, object() objet retourne sans relief, ce qui signifie qu'il ne peut pas avoir des attributs. Il n'a pas __dict__.

Ce que vous pouvez faire est la suivante:

>>> site = type('A', (object,), {'a': 42}) 
>>> site.a 
42 
Questions connexes