2010-07-05 31 views
11

¿Cómo hago para crear una lista de objetos (instancia de clase) en Python?Crear una lista de objetos en Python

¿O es este un resultado de un mal diseño? Necesito esto porque tengo diferentes objetos y necesito manejarlos en una etapa posterior, por lo que seguiré agregándolos a una lista y llamándolos más tarde.

+2

Qué quiere decir una lista de los objetos de texto ('[tipo (x), ...]') o instancias de una clase ('[1, 2, 3]')? – Skurmedel

+0

@Skurmedel: instancias de clase. Lo mencioné específicamente en la pregunta :) – user225312

+0

@Alfred: hehe, solo encuentro que las instancias de clase son un poco ambiguas, pero veo lo que quieres decir con la respuesta seleccionada: P – Skurmedel

Respuesta

32

Almacenamiento de una lista de instancias de objetos es muy simple

class MyClass(object): 
    def __init__(self, number): 
     self.number = number 

my_objects = [] 

for i in range(100): 
    my_objects.append(MyClass(i)) 

# later 

for obj in my_objects: 
    print obj.number 
+0

donde pasas "objeto" en la primera línea, es que un objeto real o solo un número que representa el número de la instancia de objeto? Si tuviera que escribir my_objects (1), Llamaría al primer objeto, pero no creo que el 1 que se pasa sea un objeto. Esto podría ser completamente ortogonal a los propósitos educativos de la respuesta original, pero me ayudaría en un tema diferente relacionado con el que estoy luchando. Gracias. –

4

El tutorial de Python discute how to use lists.

Almacenar una lista de clases no es diferente de almacenar cualquier otro objeto.

def MyClass(object): 
    pass 

my_types = [str, int, float, MyClass] 
-1

Creo que lo estás haciendo de aquí es el uso de una estructura que contiene las instancias de la clase. No sé la sintaxis para nombrar estructuras en python, pero en Perl podría crear una estructura obj.id [x] donde x es un número entero incrementado. Entonces, podría referirme a la instancia de clase específica que necesitaba al hacer referencia numérica a la estructura. ¿Es esto algo en la dirección de lo que estás tratando de hacer?

2

En Python, el nombre de la clase se refiere a la instancia de la clase. Considere:

class A: pass 
class B: pass 
class C: pass 

lst = [A, B, C] 

# instantiate second class 
b_instance = lst[1]() 
print b_instance 
0

si my_list es la lista que desea almacenar los objetos en ella y mi_objeto es su objeto quería ser almacenado, utilice esta estructura:

my_list.append(my_object) 
0

tengo algunas respuestas hacky que es probable que sea terrible ... pero tengo muy poca experiencia en este punto.

manera:

class myClass(): 
    myInstances = [] 
    def __init__(self, myStr01, myStr02): 
     self.myStr01 = myStr01 
     self.myStr02 = myStr02 
     self.__class__.myInstances.append(self) 

myObj01 = myClass("Foo", "Bar") 
myObj02 = myClass("FooBar", "Baz") 

for thisObj in myClass.myInstances: 
    print(thisObj.myStr01) 
    print(thisObj.myStr02) 

Una forma truco para conseguir este hecho:

import sys 
class myClass(): 
    def __init__(self, myStr01, myStr02): 
     self.myStr01 = myStr01 
     self.myStr02 = myStr02 

myObj01 = myClass("Foo", "Bar") 
myObj02 = myClass("FooBar", "Baz") 

myInstances = [] 
myLocals = str(locals()).split("'") 
thisStep = 0 
for thisLocalsLine in myLocals: 
    thisStep += 1 
    if "myClass object at" in thisLocalsLine: 
     print(thisLocalsLine) 
     print(myLocals[(thisStep - 2)]) 
     #myInstances.append(myLocals[(thisStep - 2)]) 
     print(myInstances) 
     myInstances.append(getattr(sys.modules[__name__], myLocals[(thisStep - 2)])) 

for thisObj in myInstances: 
    print(thisObj.myStr01) 
    print(thisObj.myStr02) 

Otro más 'inteligente' truco:

import sys 
class myClass(): 
    def __init__(self, myStr01, myStr02): 
     self.myStr01 = myStr01 
     self.myStr02 = myStr02 

myInstances = [] 
myClasses = { 
    "myObj01": ["Foo", "Bar"], 
    "myObj02": ["FooBar", "Baz"] 
    } 

for thisClass in myClasses.keys(): 
    exec("%s = myClass('%s', '%s')" % (thisClass, myClasses[thisClass][0], myClasses[thisClass][1])) 
    myInstances.append(getattr(sys.modules[__name__], thisClass)) 

for thisObj in myInstances: 
    print(thisObj.myStr01) 
    print(thisObj.myStr02) 
Cuestiones relacionadas