Creación de variables dinámicas [duplicado]

Resuelto jtsmith1287 asked hace 12 años • 6 respuestas

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.

jtsmith1287 avatar Aug 15 '12 11:08 jtsmith1287
Aceptado

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'
Ashwini Chaudhary avatar Aug 15 '2012 04:08 Ashwini Chaudhary

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, attributescomo podemos ver en el __init__constructor o como se llama en otros lenguajes.

Pero tú tienes

Person.attributes.append(local_var)

aquí Personhay 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...

Samy Vilar avatar Aug 15 '2012 04:08 Samy Vilar