2010-07-05 26 views
11

Wie gehe ich beim Erstellen einer Liste von Objekten (Klasseninstanz) in Python?Erstellen einer Liste von Objekten in Python

Oder ist das ein Ergebnis von schlechtem Design? Ich brauche diese Ursache, weil ich verschiedene Objekte habe und ich muss sie zu einem späteren Zeitpunkt behandeln, also würde ich sie einfach zu einer Liste hinzufügen und sie später aufrufen.

+2

Haben Sie eine Liste von Objekten des Typs bedeuten ('[type (x), ...]') oder Instanzen einer Klasse ('[1, 2, 3]')? – Skurmedel

+0

@Skurmedel: Klasseninstanzen. Ich erwähnte es speziell in der Frage :) – user225312

+0

@Alfred: hehe, ich finde nur Klassen Instanzen ein wenig mehrdeutig, aber ich sehe, was Sie jetzt durch die ausgewählte Antwort bedeuten: P – Skurmedel

Antwort

32

eine Liste von Objektinstanzen zu speichern ist sehr einfach

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

Wo übergeben Sie "Objekt" in der ersten Zeile, ist dass ein tatsächliches Objekt oder nur eine Zahl die Nummer der Objektinstanz angibt? Wenn ich schreiben würde my_objects (1), Ich würde das erste Objekt aufrufen, aber ich glaube nicht, dass die 1, die übergeben wird, ein Objekt ist. Dies könnte völlig orthogonal zu den pädagogischen Zwecken der ursprünglichen Antwort sein, aber es würde mir bei einem anderen, verwandten Thema helfen, mit dem ich zu kämpfen habe. Vielen Dank. –

4

Das Python-Lernprogramm behandelt how to use lists.

Das Speichern einer Liste von Klassen ist nicht anders als das Speichern anderer Objekte.

def MyClass(object): 
    pass 

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

Ich denke, was Sie hier tun eine Struktur, die Instanzen der Klasse verwendet. Ich kenne die Syntax für das Benennen von Strukturen in Python nicht, aber in Perl konnte ich eine Struktur obj.id [x] erstellen, wobei x eine inkrementierte Ganzzahl ist. Dann könnte ich einfach auf die spezifische Klasseninstanz verweisen, die ich benötigte, indem ich die Struktur numerisch referenzierte. Ist das etwas in der Richtung dessen, was du versuchst?

2

In Python bezieht sich der Name der Klasse auf die Klasseninstanz. Bedenken Sie:

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

lst = [A, B, C] 

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

wenn my_list die Liste, die Sie möchten, dass Ihre Objekte speichern darin und my_object ist Ihr Objekt gespeichert werden wollte, benutzen Sie diese Struktur:

my_list.append(my_object) 
0

ich einige Hacky Antworten haben, dass sind wahrscheinlich schrecklich ... aber ich habe zu diesem Zeitpunkt sehr wenig Erfahrung.

eine Art und Weise:

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) 

Ein Hack Weg, dies zu tun bekommen:

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) 

Eine andere mehr 'klug' Hack:

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) 
Verwandte Themen