¿Lista de Python para almacenar instancia de clase?

Dada una clase de python class Student(): y una lista de names = [] ; luego quiero crear varias instancias de Student() y agregarlas a los names lista,

 names = [] # For storing the student instances class Student(): def __init__(self, score, gender): self.score = score self.gender = gender 

Y ahora quiero ver los puntajes de todos los estudiantes varones, ¿puedo hacerlo de esta manera?

 scores = [] for i in names: if i.gender == "Male": scores.append(i.score) 

Mi pregunta es: ¿Cómo crear una lista que pueda (si pudiera hacerse con cualquier statement) almacenar la instancia de Student ? O más bien, cuando escribo names = [] , ¿cómo podría declarar que cada elemento en los names es una instancia de Student para que pueda usar los atributos de este elemento a pesar de que Python es de tipo débil? Espero haberme aclarado;)

Puedo escribir como

  for i in range(len(names)): student = Student() student = names[i] if student.gender == "Male": # Whatever 

Supongo que no…

¿Has probado tu código de arriba? Debería funcionar bien. Puedes condensarlo en:

 scores = [ student.name for student in names if student.gender == "Male" ] 

Tenga en cuenta que llamar a los names la lista es engañoso, ya que es una lista de instancias de Student .

No puede definir la lista como una lista de instancias de Estudiante; Así no es como funciona Python.

¿Estás preguntando cómo crear la lista que has llamado names ?

 names = [ ] for ( score, gender ) in : names.append( Student( score, gender ) ) 

que por supuesto es equivalente a

 names = [ Student( score, gender ) for score, gender in  ] 

y a su vez para

 names = [ Student( *row ) for row in  ] 

Si necesita realizar mucho procesamiento para cada fila, puede mover el procesamiento a una función separada o usar un bucle for .

 def process_row( row ): ... return score, gender names = [ Student( *process_row( row ) ) for row in  ] 

Respondiendo a su edición, creo que está intentando declarar los tipos de variables en Python. Tu escribiste:

 for i in range(len(names)): student = Student() student = names[i] if student.gender == "Male": # Whatever 

¿Cuál es el propósito de la línea student = Student() – estás tratando de declarar el tipo de student variable? No hagas eso Lo siguiente hará lo que pretendías:

 for student in students: if student.gender == "Male": # Whatever 

Note varias cosas:

  1. No necesitamos iterar sobre el range(n) y luego buscar cada instancia en names ; iterar sobre cada elemento de un contenedor es el propósito de un bucle for .
  2. No es necesario que haga ninguna afirmación sobre lo student es un student : podría ser una cadena, un booleano, una lista, un Student , lo que sea. Esta es la escritura dinámica . Del mismo modo, los students no tienen que ser una lista; puedes iterar sobre cualquier iterable .
  3. Cuando escriba student.gender , Python obtendrá el atributo de gender de student o generará una excepción si no tiene uno.

En primer lugar Python no se escribe débilmente. Sin embargo, se escribe dinámicamente para que no pueda especificar un tipo de elemento para su lista.

Sin embargo, esto no le impide acceder a los atributos de un objeto. Esto funciona bien:

 names = [Student(1,"Male"), Student(2,"Female")] scores = [] for i in names: if i.gender == "Male": scores.append(i.score) 

Sin embargo, es más sintético escribir esto utilizando una lista de comprensión:

 names = [Student(1,"Male"), Student(2,"Female")] scores = [i.score for i in names if i.gender == "Male"] 

Soy bastante nuevo en OOP, pero ¿esto no hace lo que quieres muy bien? name_list es una variable de clase, y cada vez que creas un nuevo objeto Student , se agrega a Student.name_list . Digamos, por ejemplo, que tenía un método cheat(self) que deseaba realizar en el tercer alumno, podría ejecutar Student.name_list[2].cheat() . Código:

 class Student(): name_list = [] def __init__(self, score, gender): Student.name_list.append(self) self.score = score self.gender = gender #this is just for output formatting def __str__(self): return "Score: {} || Gender: {}".format(self.score, self.gender) #again for output formatting def update(): print([str(student) for student in Student.name_list]) update() Student(42, "female") update() Student(23, "male") update() Student(63, "male") Student(763, "female") Student("over 9000", "neutral") update() 

Salida:

 [] ['Score: 42 || Gender: female'] ['Score: 42 || Gender: female', 'Score: 23 || Gender: male'] ['Score: 42 || Gender: female', 'Score: 23 || Gender: male', 'Score: 63 || Gender: male', 'Score: 763 || Gender: female', 'Score: over 9000 || Gender: neutral']