2010-03-11 6 views
16

Disons que je crée une instance d'une classe et que je veux assigner des valeurs à ses propriétés publiques. Habituellement, cela se fait comme ceci:Comment accéder dynamiquement aux propriétés de classe en Python?

class MyClass: 
    def __init__(self): 
     self.name = None 
     self.text = None 

myclass = MyClass() 
myclass.name = 'My name' 

Mais, si une écriture d'une fonction qui prend une classe en tant que paramètre et je voudrais attribuer des valeurs aux propriétés publiques de cette classe dynamique - qui est par les variables et les boucles (sans. savoir combien il y a ou ce qu'ils sont appelés)

L'évidente serait:

myclass = MyClass() 
myclass['name'] = "My name" 

Mais cela ne fonctionne pas.

Des idées?

+0

En outre, il s'agit d'un doublon: http://stackoverflow.com/questions/1167398/python-access-class-class-property-from-string –

Répondre

31
setattr(my_class_instance, 'attr_name', attr_value) 
+4

La documentation peut être trouvée ici: http://docs.python.org/ library/functions.html –

0

En utilisant dir avec setattr devrait faire le travail

class MyClass: 
    def __init__(self): 
    self.name = None 
    self.text = None 

myclass = MyClass() 
myclass.name = 'My name' 

for prop in dir(myclass): 
    print '%s:%s'%(prop,getattr(myclass,prop)) 

print 

for prop in dir(myclass): 
    if prop[:2]!='__' and prop[-2:]!='__': 
     print prop[-2:] 
     setattr(myclass,prop,"Foo Bar") 

for prop in dir(myclass): 
    print '%s:%s'%(prop,getattr(myclass,prop))  

Mais attention, car ce code définit également '__doc__', '__init__', '__module__' propriétés à "Foo Bar". Donc, vous devrez prendre soin d'éviter certaines choses qui vous sont données par dir (en particulier ceux qui commencent et se terminent par __ double underscores).

4

Après la lecture rejetée Syntax For Dynamic Attribute Access J'utilise une classe mixin fournissant un accès style dictionnaire aux attributs d'un objet:

class MyClass: 
    def __init__(self): 
     self.name = None 
     self.text = None 
    def __getitem__(self, name): 
     return getattr(self, name) 
    def __setitem__(self, name, value): 
     return setattr(self, name, value) 
    def __delitem__(self, name): 
     return delattr(self, name) 
    def __contains__(self, name): 
     return hasattr(self, name) 

tout en étant en mesure de définir les attributs directement:

myclass = MyClass() 
myclass.name = "foo" 
myclass.text = "bar" 

il est alors possible de les définir dynamiquement:

for attr in ('name', 'text'): 
    myclass[attr] = confirm(attr, default=myclass[attr]) 
+0

Il devrait être la réponse acceptée – TyrionGraphiste

Questions connexes