2010-03-11 36 views
16

Digamos que creo una instancia de una clase y quiero asignar algunos valores a sus propiedades públicas. Por lo general, esto se haría así:¿Cómo acceder dinámicamente a las propiedades de clase en Python?

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

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

Pero, ¿y si un escribir una función que toma una clase como parámetro y me gustaría asignar algunos valores a las propiedades públicas de esa clase de forma dinámica - es decir a través de variables y bucles (sin saberlo. cuántos hay o qué se les llama)

La obvia sería:

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

Pero eso no quiere trabajar.

¿Alguna idea?

+0

Además, este es un duplicado: http://stackoverflow.com/questions/1167398/python-access-class-property-from-string –

Respuesta

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

La documentación se puede encontrar aquí: http://docs.python.org/ library/functions.html –

0

Usando dir con setattr debe hacer el trabajo

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))  

Pero tenga cuidado porque este código también establece '__doc__', '__init__', '__module__' propiedades a "Foo bar". Por lo tanto, tendrá que evitar ciertas cosas que le da dir (especialmente aquellas que comienzan y terminan con __ doble guión bajo).

4

Después de la lectura rechazó Syntax For Dynamic Attribute Access estoy usando una clase mixin proporcionar acceso diccionario de estilo a los atributos de un objeto:

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) 

sin dejar de ser capaz de definir los atributos directamente:

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

entonces es posible configurarlos dinámicamente:

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

Debería ser la respuesta aceptada – TyrionGraphiste

Cuestiones relacionadas