Probleme mit Klassen

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
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

Guten Abend, ihr Python Profis :-)

da ich erst seit wenigen Tagen in Python programmiere, bin ich echt am Zweifeln, was der Interpreter von mir will, denn ich bekomme immer diese Fehlermeldung:

<unbound method queue.dequeue> usw.

Code: Alles auswählen

list=["Bla1", "Bla2", "Bla3", "Bla4"]
input=raw_input("Noch was eingeben: ")

class queue(object):
    global list
    global input
    def enqueue(self,input):
        self.list.append(input)
        return self.list
    def dequeue(self):
        self.list.pop(0)
        return self.list

class stack(object):
    global list
    global input
    def push(self,input):
        list.append(input)
        return self.list
    def pop(self):
        if len(list)==0:
            return None
        else:
            list.pop()
        return self.list
Was ich versuche, ist nämlich, stack und queue in Python mit lists zu realisieren, ohne Klassen klappts ja auch wunderbar, aber darin verpackt bekomme ich dann immer dieselbe Fehlermeldung, bitte um Hilfe ...
BlackJack

Es kann nicht sein, dass Du bei *dem* Quelltext eine Fehlermeldung von `queue.dequeue` bekommst. Bitte gib immer Quelltext und Fehlermeldungen an die wirklich zusammengehören. Bei Ausnahmen am besten den kompletten Traceback.

Vergiss das es ``global`` gibt und lerne wie Klassen funktionieren. Für solche Grundlagen gibt's Tutorials.
pythonguy
User
Beiträge: 28
Registriert: Donnerstag 22. November 2007, 18:51

Ich habe ja versucht, einzelne Funktionen in der Klasse aufzurufen mit queue.enqueue z.B. Was ist denn so schlimm an global?
BlackJack

Mit ``queue.enqueue`` rufst Du die Methode nicht auf sondern holst Dir die `enqueue`-Methode von der `queue`-Klasse, was in diesem Fall dann eine ungebundene Methode ist. Wenn Du ein Objekt *aufrufen* willst, dann musst Du die Argumente für den Aufruf in Klammern angeben. Wenn der Aufruf keine Argumente benötigt reichen leere Klammern.

Was hättest Du denn erwartet was passiert wenn Du das einfach so da hinschreibst!? Ich meine die Methode erwartet doch Argumente.

Es macht aber auch wenig Sinn eine Methode (ausser bei "static"- oder "class"-Methoden) auf der *Klasse* aufzurufen. Da wären wir wieder bei: Bitte die Grundlagen von OOP in einem Tutorial erarbeiten.

``global`` ist *hier* einfach nur sinnlos, und ansonsten sollten Werte Funktionen nur als Argumente betreten und als Rückgabewerte verlassen. Sonst bekommt man ganz schnell unübersichtliche Datenflüsse und Abhängigkeiten von Funktionen und Modulen die nicht sein müssten.

Des weiteren müssen nicht alle Methoden einen Rückgabewert haben. Zum Beispiel `push()` oder `enqueue()`. Es gibt Sprachen da wird in solchen Fällen meistens das Objekt selbst zurückgegeben, aber das ist in Python nicht üblich, weil eine lange Verkettung von Methodenaufrufen nicht so gerne gesehen wird.
rezeptor
User
Beiträge: 8
Registriert: Dienstag 6. November 2007, 23:02

@blackjack: hast du vllt zufällig ein gutes tutorial zum them (ooa/ood) oop am start? ich hab hier zwar literatur zu dem thema liegen (bernd oesterrecih - objektorientierte software entwicklung / analyse und design design mit der uml). will momentan aber noch nicht mit kanonen auf spatzen schießen.

grüße ausser oberpfalz,

:peter
hast du python in der tasche,hast du immer was zum nasche...
rezeptor
User
Beiträge: 8
Registriert: Dienstag 6. November 2007, 23:02

@rafael: danke für die links, aber ich hatte da eigentlich anspruchsvollere tutorials im sinn.
hast du python in der tasche,hast du immer was zum nasche...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Objektorientierte Programmierung von Weigend oder dessen Kapitel in Exploring Python?

Wobei: OOP ist in aller Regel nicht anspruchsvoll. Es geht nur darum das Konzept zu verstehen. Anspruchsvoller wird es wenn du Metaklassen nutzt, aber das brauchst du in der Regel nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Leonidas hat geschrieben:Wobei: OOP ist in aller Regel nicht anspruchsvoll. Es geht nur darum das Konzept zu verstehen. Anspruchsvoller wird es wenn du Metaklassen nutzt, aber das brauchst du in der Regel nicht.
Genauso seh' ich das auch. In den ersten Sekunden kommt einem alles so unlogisch und unnütz vor, aber irgendwann macht's *klick* und es ist alles vollkommen klar. Danach fragt man sich, wie man ohne sie klarkommen konnte. oop ist im Gegensatz zu vielem anderen einfach nur Übungssache.
BlackJack

Ich denke man muss zwischen Klassen und OOP unterscheiden. Eine Klasse zu implementieren, die Daten und Operationen sinnvoll zusammen fasst, ist nicht so schwer. Zu OOP gehört aber auch das entwerfen von komplexeren Systemen aus interagierenden Objekten. Wobei man dann ein paar Regeln beachten muss, die manchmal Abwägungen erfordern, die nicht mehr so leicht sind. Wie teile ich die Daten auf, wie (un)abhängig sollen oder dürfen diese Objekte voneinander sein, modelliere ich dieses oder jenes als Vererbung, Komposition oder Mixin, ist das jetzt ein Typ mit verschiedenen Daten oder ist jedes Datum ein eigener Typ, und so weiter…
rezeptor
User
Beiträge: 8
Registriert: Dienstag 6. November 2007, 23:02

Mein letzter Beitrag sollte nicht falsch verstanden werden.

Der Beitrag von
BlackJack hat geschrieben:Ich denke man muss zwischen Klassen und OOP unterscheiden. Eine Klasse zu implementieren, die Daten und Operationen sinnvoll zusammen fasst, ist nicht so schwer. Zu OOP gehört aber auch das entwerfen von komplexeren Systemen aus interagierenden Objekten. Wobei man dann ein paar Regeln beachten muss, die manchmal Abwägungen erfordern, die nicht mehr so leicht sind. Wie teile ich die Daten auf, wie (un)abhängig sollen oder dürfen diese Objekte voneinander sein, modelliere ich dieses oder jenes als Vererbung, Komposition oder Mixin, ist das jetzt ein Typ mit verschiedenen Daten oder ist jedes Datum ein eigener Typ, und so weiter…
drückt aus, worum es mir geht. Meine Anwendungen (nicht nur die in Python) habe ich, sogut es meine Logik als nicht studierter Informatiker zulässt, strukturiert. Ich frage mich aber oft, wie wohl ein richtiger Informatiker den Code modelliert hätte.

Naja,ich werde jetzt wohl erstmal schauen,was ich aus meiner o.g. Literatur ziehen kann,ohne dabei zuweit ins theoretische Metaland abzudriften.

P.S.: Die Buchtipps für Weigner sind ziemlich interessant.
hast du python in der tasche,hast du immer was zum nasche...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

rezeptor hat geschrieben:drückt aus, worum es mir geht. Meine Anwendungen (nicht nur die in Python) habe ich, sogut es meine Logik als nicht studierter Informatiker zulässt, strukturiert. Ich frage mich aber oft, wie wohl ein richtiger Informatiker den Code modelliert hätte.
"Richtige" Informatiker sind oftmals zu sehr auf Java fixiert und setzen Java gleich OOP. Das führt dann dazu, dass zwangsweise alles Klassen sind, auch Dinge die mit Objekten nichts zu tun haben.

OOP hat nicht immer die Lösung. Viele Dinge lassen sich ganz verschieden modellieren, die Kunst ist es so zu modellieren dass die Klassen sinnvoll verwendet werden, d.h. dem Verständnis des Programmes zuträglich sind und das Programm einfacher statt komplizierter machen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten