Klassen und for-loops

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Ich wollte meinen Code etwas besser strukturieren und habe jetzt, statt Listen einfach zusammenzuzippen ein Objekt mit verschiedenen Eigenschaften eingeführt.

davor:

Code: Alles auswählen

info_neu = zip(qcont, around, nameiso, a1, abu)
for q_cont, a_round, name_iso, a_1, abu_element in zip(qcont, around, nameiso, a1, abu):
   do something
danach:

Code: Alles auswählen

class ContaminationEntry(object):
    def __init__(self, info_neu):
        self.qcont = int(info_neu[0])
        self.around = int(info_neu[1])
        self.nameiso = nameiso
        self.a1 = float(a1)
        self.abu = float(abu)
ich bräuchte wieder die gleiche for-Sequenz mit der Klasse, bekomme es aber nicht hin.
Außerdem wäre meine Frage, ob man Klassen einfach wie Funktionen übergeben kann, dh. ob, wenn ich in einer Funktion eine Klasse nützen will, die ich außerhalb der Funktion definiert habe, einfach:

Code: Alles auswählen

def new_function(ContaminationEntry, other_function,..):
Vielen Dank im Vorraus! Mit Klassen hadere ich noch etwas.
Peter
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

in Deinem Fall würde ich ein namedtuple nehmen:

Code: Alles auswählen

from collections import namedtuple
class ContaminationEntry(namedtuple('ContaminationEntry','q_cont, a_round, name_iso, a_1, abu')):
    def __new__(cls, info_neu, nameiso, a1, abu):
        return namedtuple.__new__(int(info_neu[0]), int(info_neu[1]), nameiso, float(a1), float(abu))
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Okay, funktioniert das auch wenn q_cont, a_round, etc. Listen sind= und wie grefie ich dann mit einem for-loop auf die einzelnen Elemente zu?
BlackJack

@peter99: Du vermischst hier IMHO ein wenig. Wenn zu jedem `ContaminationEntry` *ein* Element aus der Liste `q_cont` gehört, dann kannst Du an das ContaminationEntry`-Exemplar nicht die ganze Liste binden sondern müsstest das zu diesem Exemplar gehörende Element aus der Liste verwenden. In Deinem Beispiel ist sowieso ein wenig komisch das einige der Werte die in `__init__()` an Attribute gebunden werden ganz einfach auf magische Weise zu existieren zu scheinen, statt als Argumente übergeben zu werden. Wenn das alles Listen sind mit jeweils zusammengehörigen Elementen, dann musst Du auch weiterhin `zip()` verwenden.

Klassen sind Objekte die man wie alle anderen Objekte auch an Namen binden oder als Argumente übergeben kann. Eine Klasse kann man als Funktion ansehen die beim Aufruf Objekte von dem Typ erstellt, den die Klasse repräsentiert.
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

@BlackJack: nur um mich zu versichern.
qcont, abu, etc. sind alles Listen.
Jedes 1. Element jeder Liste gehört zusammen, dh. 1. Element von qcont ist mit erstem Element von abu verknüpft. Es ist nicht möglich das Problem mit einer Klasse zu handeln, da das nur die einzelnen Listen verknüpft, aber nicht das 1. Element mit dem 1. und so fort.
Habe ich das richtig verstanden?
Danke!
BlackJack

@peter99: Da wir „das Problem” nicht kennen, kann man auch schlecht sagen ob und wie man dort sinnvoll eine Klasse einsetzen kann. Wenn ich raten müsste denkst Du das Du `zip()` durch eine Klasse ersetzen kannst, wo ich eher vermute Du brauchst beides: `zip()` um dann eine Liste mit Objekten zu erzeugen wo die zusammengehörigen Daten auch jeweils gemeinsam drin gespeichert sind.
Antworten