Objektanzahl | Wie viele Instanzen

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
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Hallo und guten Morgen!

Ich habe folgende Frage zu Klassen und Objekten in Python:
(es bezieht sich wieder auf meine Klasse "Person", deren Instanzen in eine Liste gepackt werden...)

Ich möchte herausfinden, wie viele Objekte ich (oder der Benutzer) erzeugt hat.
Da ich keinen anderen Weg gefunden hatte, habe ich bisher folgendes gemacht:

Code: Alles auswählen

counter = 0
for element in liste:
    counter += 1
print counter
Das funktioniert zwar, aber erscheint mir nicht ideal.
Gibt es keine Methode, mit der ich entweder herausfinden kann, wie viele Objekte in einer Liste sind, in etwa so:

Code: Alles auswählen

eintraege = liste.count()
oder um herauszufinden, wie viele Instanzen einer Klasse erzeugt wurden, z.B so:

Code: Alles auswählen

instanzen = cPerson.inst()
?

Bin um jeden Tip dankbar, da weder die Hilfe, noch die Forensuche Früchte getragen hat. Danke.
Gruß!
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Die Länge der Liste kannst du mit len(liste) herausfinden.

Anders wäre es glaubs auch mit einer Metaklasse zu machen oder mit einer Counter-Klasse als Klassenvariable.

Gruss
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Code: Alles auswählen

len(liste)
Vielen Dank. Das wäre ja ganz einfch gewesen. Warum bin ich blos nicht drüber gestolpert?

Danke.
Gruß!
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Tja, jetzt habe ich doch glatt noch ne Frage zu den Objekten. Irgendwie will mir da der Knopf nicht aufgehen.

Kann ich Objekte auch dynamisch erzeugen? Also ich meine:

Code: Alles auswählen

class Person(object):
    def __init__(self)
    .
    .

p1 = Person()
p2 = Person()
wäre ja die normale Vorgehensweise.

Das heisst aber, dass ich als Programmierer die Instanznamen (p1 ... pn) schon vorher wissen muss.

Was aber, wenn ich nicht weiss, wie viele Objekte mein Benutzer erzeugt?
Ich könnte ja nen Zähler mitlaufen lassen, der jedes Erzeugen eines Objektes mitprotokolliert. Wenn ich ein neues Objekt haben will, setzt sich der Name des neuen Objektes aus z.B. einem Objektkürzel und dem Counter zusammen.
z.B.: Objektname + counter = Neuer Objektname
Gruß!
Lynx
User
Beiträge: 4
Registriert: Samstag 23. September 2006, 22:48

Du könntest einfach eine Liste an Objekten benutzen:

Code: Alles auswählen

liste = []

liste.append(Person())
liste.append(Person())
- Lynx
BlackJack

Wenn der Benutzer die Namen nicht vorher weiss, wie soll er sie denn dann benutzen!?

Wenn Du keine "festen" Namen für Objekte hast, dann speicherst Du sie zum Beispiel in einer Liste und kannst mit Zahlen darauf zugreifen, oder in einem Dictionary, dann kannst Du zum Beispiel auch mit Zeichenketten darauf zugreifen.

Was möchtest Du denn genau machen/erreichen?
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Tja, ich bin auch der "einfachen" Aufgabe aus "byte of python" erlegen, eine Art "Adressbuch" zu schreiben.

Da ich zu allererst wissen wollte, wie man Listen Speichert, habe ich mit Objekten, Listen und pickle rumgespielt (siehe oben).

Bisher habe ich bei meinen Tests immer erst ein paar Objekte erzeugt (deren namen ich festgelegt hatte) und dann einfach eine Liste mit diesen Objekten darin erstellt. Funktionierte natürlich auch sehr gut.
Nur habe ich eben jetzt den Fall, dass ich nicht weiss, wie viele Objekte angelegt werden.
Zudem wusste ich nicht, ob

Code: Alles auswählen

liste.append(Person())
überhaupt möglich ist.

Worauf will ich hinaus?
Da mein Proggi ein einfaches Konsolenprogramm werden soll, habe ich es mir so vorgestellt:

bitte Namen des Kontakts eingeben: _hier Eingabe und speichern in Variable var_name.
bitte Alter des Kontakts eingeben: _hier Eingabe und .... _
bitte Email des Kontakts eingeben: _ hier Eingabe und ...._


Diese 3 Werte sollen dem Konstruktor nun mitübergeben werden.
Folglich müsste dies ja funktionieren,

Code: Alles auswählen

liste.append(Person(var_name, var_alter, var_email))
, oder?
Gruß!
BlackJack

Ja das funktioniert. Ist auch ziemlich leicht auszuprobieren. :-)
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

:oops:
ja, schon verstanden.... ;)

Dankeschön.
Gruß!
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Das var_ ist übrigens überflüsig. Man sieht schon, dass es eine Variable ist (kleingeschrieben). Du schreibst ja auch nicht var_liste...
Antworten