Creación de variables dinámicas [duplicado]
Mi pregunta es cómo crear variables "sobre la marcha". Estoy intentando generar un objeto con un conjunto aleatorio de atributos.
from random import randint, choice
class Person(object):
def __init__(self):
self.attributes = []
possible_attributes= ['small', 'black', 'scary', 'smelly', 'happy'] # idk, random
chance = randint(1,5)
chosen_attributes = []
for i in xrange(chance):
#psuedo code...
local_var = choice(possible_attributes)
if local_var not in chosen_attributes:
VAR = local_var # VAR needs to be dynamic and 'global' for use later on
chosen_attributes.append(local_var)
Person.attributes.append(local_var)
Estoy seguro de que quiero hacer esto no es una buena manera, por lo que si alguien entiende lo que estoy buscando y puede ofrecer un método mejor (uno que funcione, para empezar), se lo agradecería mucho.
Para agregar atributos a una instancia de la clase puedes usar .__dict__
:
class Person(object):
def addattr(self,x,val):
self.__dict__[x]=val
producción:
>>> a=Person()
>>> a.addattr('foo',10)
>>> a.addattr('bar',20)
>>> a.foo
10
>>> a.bar
20
>>> b=Person()
>>> b.addattr('spam','somevalue')
>>> b.spam
'somevalue'
Bueno, no estoy seguro de lo que intentas lograr aquí, pero puede que haya un par de cosas aquí...
class Person(object):
def __init__(self):
self.attributes = []
Esto define un objeto de clase a partir del cual puede crear objetos que contengan, attributes
como podemos ver en el __init__
constructor o como se llama en otros lenguajes.
Pero tú tienes
Person.attributes.append(local_var)
aquí Person
hay un objeto de clase que realmente no tiene los atributos que se definen ya que son solo para objetos creados a partir de esta clase...
puede crear una nueva persona y agregarle los atributos apropiados.
>>> me = Person()
>>> me.attributes.append('humble')
En segundo lugar, no deberíamos acceder a los atributos directamente, ya que cualquier cosa podría agregarse a una lista, incluidos los atributos duplicados.
Entonces, ¿por qué no simplemente agregar una función que agregue atributos?
class Person(object):
def __init__(self):
self._attributes = [] # note any variable starting with _ is meant to be private
def add_attribute(attribute):
if attribute not in self._attributes:
self._attributes.append(attribute)
Si el rendimiento es una preocupación, podemos usar a set()
en lugar de, []
ya que no permitirá entradas duplicadas y verificaciones realmente rápidas para cualquier búsqueda. La desventaja es que los valores deben poder ser hash, es decir, cadenas o ints u otros tipos de datos simples...