Python: crear instancias de objetos en un bucle con manejo independiente

Tengo un progtwig electoral simple. Los siguientes son los requisitos:

  1. class Politician
  2. Votos aleatorios.
  3. Tomando el número de políticos como entrada del usuario.

     num_politicians = input("The number of politicians: ") 
  4. Bucle y creación de instancias.

     names = [] for x in range(num_politicians): new_name = input("Name: ") while new_name in names: new_name = input("Please enter another name: ") names.append(new_name) #### This part is the crux of my problem ### Create instances of the Politician class #### I want to do this in a way so that i can independently #### handle each instance when i randomize and assign votes 

He mirado a

  1. ¿Cómo creas diferentes nombres de variables mientras estás en un bucle? (Pitón)
  2. Python: Crear instancia de un objeto en un bucle

Sin embargo no pude encontrar una solución a mi problema.

La clase de político está abajo:

 class Politician: def __init__(self, name): self.name = str(name) self.age = age self.votes = 0 def change(self): self.votes = self.votes + 1 def __str__(self): return self.name + ": " + str(self.votes) 

La salida deseada:

 >>> The Number of politicians: 3 >>> Name: John >>> Name: Joseph >>> Name: Mary >>> Processing... (I use time.sleep(1.0) here) >>> Mary: 8 votes >>> John: 2 votes >>> Joseph: 1 vote 

Mi problema en una statement

Quiero crear instancias de clase en el bucle for de tal manera que pueda asignarles votos al azar (Supongo que esto requeriría que yo manejara las instancias de forma independiente).

Cualquier ayuda sería apreciada.

Puedes almacenar tus instancias en una lista:

 politicians = [] for name in 'ABC': politicians.append(Politician(name)) 

Ahora puedes acceder a instancias individuales:

 >>> politicians[0].name 'A' 

Usé una versión modificada de su clase que le da a cada político una edad predeterminada si no se proporciona:

 class Politician: def __init__(self, name, age=45): self.name = str(name) self.age = age self.votes = 0 def change(self): self.votes = self.votes + 1 def __str__(self): return self.name + ": " + str(self.votes) 

Ahora puedes trabajar con tu lista de políticos:

 print('The Number of politicians: {}'.format(len(politicians))) 

huellas dactilares:

 The Number of politicians: 3 

esta:

 for politician in politicians: print(politician) 

huellas dactilares:

 A: 0 B: 0 C: 0 

Asignar votos al azar:

 import random for x in range(100): pol = random.choice(politicians) pol.votes += 1 

Ahora:

 for politician in politicians: print(politician) 

huellas dactilares:

 A: 35 B: 37 C: 28 

Todo el progtwig:

 # Assuming Python 3. class Politician: def __init__(self, name, age=45): self.name = str(name) self.age = age self.votes = 0 def change(self): self.votes = self.votes + 1 def __str__(self): return '{}: {} votes'.format(self.name, self.votes) num_politicians = int(input("The number of politicians: ")) politicians = [] for n in range(num_politicians): if n == 0: new_name = input("Please enter a name: ") else: new_name = input("Please enter another name: ") politicians.append(Politician(new_name)) print('The Number of politicians: {}'.format(len(politicians))) for politician in politicians: print(politician) print('Processing ...') for x in range(100): pol = random.choice(politicians) pol.votes += 1 for politician in politicians: print(politician) 

Y el uso:

 The number of politicians: 3 Please enter a name: John Please enter another name: Joseph Please enter another name: Mary The Number of politicians: 3 John: 0 votes Joseph: 0 votes Mary: 0 votes Processing ... John: 25 votes Joseph: 39 votes Mary: 36 votes 

ACTUALIZAR

Como sugiere @martineau, para los problemas en tiempo real, un diccionario sería más útil.

Crear diccionario en lugar de una lista:

 politicians = {} 

y en el bucle con nosotros el nombre como clave cuando agregue su instancia:

 politicians[new_name] = Politician(new_name)