2010-08-14 14 views
12

Dada una clase python class Student(): y una lista names = []; entonces yo quiero crear varias instancias de Student() y añadirlos a la lista names,lista de Python para almacenar la instancia de clase?

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

Y ahora quiero ver los resultados de todos los estudiantes de sexo masculino, 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 puede (si se podía hacer por cualquier declaración) almacenar la instancia de Student? O más bien, cuando escribo names = [], ¿cómo podría indicar cada elemento en names es una instancia de Student para que pueda usar las atribuciones de este elemento a pesar de que python es de tipo débil? Espero sido claro;)

Puedo escribir como:

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

supongo que no ...

+0

respuesta a tu edición: No, no se puede escribir que, debido a que está llamando 'Student()' sin argumentos aunque toma 2. Si elimina esa línea, funcionará. – sepp2k

+1

@ sepp2k, sí, los argumentos no coinciden en el alumno Construtor, por lo que esto ahorrará errores. bueno, creo que debería pensar sobre mi problema porque ahora tengo dificultades para expresar mi problema, lo que publiqué no era mi punto – ladyfafa

+0

si piensas en tu código un poco más puedes entender dónde está fallando. La línea 'student = Student()' intenta crear una nueva instancia 'Student' y almacenarla en la variable' student'. Esto fallará, porque al constructor le faltan algunos argumentos requeridos. Creo que estás tratando de declarar el tipo de 'estudiante' No tienes que hacer eso en Python. Lo resolverá en tiempo de ejecución. Observe también que puede iterar directamente sobre los elementos de 'names' con' for student in names: ... '. – katrielalex

Respuesta

11

Quizás quiso probar su código de seguridad? Debería funcionar bien. Puede condensarlo en:

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

Tenga en cuenta que llamar a la lista names es engañosa, ya que es una lista de Student casos.

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

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

names = [ ] 
for (score, gender) in <some-data-source>: 
    names.append(Student(score, gender)) 

que por supuesto es equivalente a

names = [ Student(score, gender) for score, gender in <some-data-source> ] 

ya su vez a

names = [ Student(*row) for row in <some-data-source> ] 

Si tiene que hacer un montón de procesamiento para cada fila entonces usted puede mover el procesamiento en una función separada o use un bucle for.

def process_row(row): 
    ... 
    return score, gender 

names = [ Student(*process_row(row)) for row in <some-data-source> ] 

respuesta a tu edición, creo que usted está tratando de declarar los tipos de variables en Python. Usted escribió:

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 la variable student? No hagas eso. A continuación se hará lo que pretende:

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

Fíjese en varias cosas:

  1. No necesitamos iterar sobre range(n) y después buscar cada caso en names; iterar sobre cada elemento de un contenedor es el propósito de un bucle for.
  2. No necesita hacer ningún reclamo sobre qué es student - podría ser una cadena, un booleano, una lista, un Student, lo que sea. Esto es tipado dinámico. Del mismo modo, students no tiene que ser una lista; puede iterar sobre cualquier iterable.
  3. Al escribir student.gender, Python obtendrá el atributo gender de student, o generará una excepción si no tiene uno.
+1

gracias por la respuesta, veo tus puntos, pero no sé cómo expresar mis problemas, aunque el – ladyfafa

+0

es bastante limpio y conciso, en algunos casos, la sentencia if puede invocar un grupo de TODOs, ¿podría funcionar esta forma? , puede que no sea tan directo? – ladyfafa

+0

¿Huh? ¿Qué es un 'TODO'? – katrielalex

4

En primer lugar python es no débilmente tipado. Sin embargo, está tipeado dinámicamente, por lo que no puede especificar un tipo de elemento para su lista.

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

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

No obstante, más Pythonic es escribir esto usando una lista por comprensión:

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

En realidad, según la mayoría de las definiciones, creo que Python * es * débilmente tipado - admite sobrecarga, conversiones de tipo implícito, polimorfismo ... Si eso no es "mecanografía débil", ¿qué es? Es cierto que el término no significa mucho de todos modos. – katrielalex

+0

También diría que tiene tipos dinámicos de Python. El OP solo sabe lo contrario: * tipos * estáticos. Parece que * strong * y * weak * son nombres bastante malos para conceptos muy similares. –

+4

No. weak type significa que no hay una gran diferencia dentro de los tipos. Entonces puedes agregar una variable de cadena a un número como si fuera un número también. En python, DEBE conocer el tipo de variable. Pero se puede encontrar en tiempo de ejecución solo o dinámicamente. – Odomontois

2

Soy bastante nuevo en programación orientada a objetos, pero esto no hace lo que quiere bastante bien ? name_list es una variable de clase, y cada vez que creas un nuevo objeto Student, se agrega al Student.name_list. Digamos por ejemplo que tenía un método cheat(self) que quería realizar en el tercer alumno, podí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'] 
Cuestiones relacionadas