una resueltos programacion poo otra orientada objetos metodo llamar listas importar ejercicios constructores con como clases clase python class

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)