resueltos - poo python 3
¿Cómo acceder dinámicamente a las propiedades de clase en Python? (3)
Después de leer la sintaxis rechazada para el acceso dinámico de atributos , estoy usando una clase mixin que proporciona acceso de estilo de diccionario 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)
Mientras aún se pueden establecer 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])
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í:
class MyClass:
def __init__(self):
self.name = None
self.text = None
myclass = MyClass()
myclass.name = ''My name''
Pero, ¿qué pasa si una escritura escribe 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 dinámicamente, es decir, a través de variables y bucles (sin saber cuántos hay o cómo se llaman). )
Lo obvio sería:
myclass = MyClass()
myclass[''name''] = "My name"
Pero eso no funciona.
¿Algunas ideas?
Usar dir
con setattr
debería 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__''
en "Foo Bar". Por lo tanto, tendrá que cuidar de evitar ciertas cosas que le da el dir
(especialmente aquellas que comienzan y terminan con __
dobles guiones bajos).
setattr(my_class_instance, ''attr_name'', attr_value)