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

Probleme mit Klassen

Beitragvon pythonguy » Donnerstag 22. November 2007, 18:56

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=]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
[/code]

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

Beitragvon BlackJack » Donnerstag 22. November 2007, 19:59

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

Beitragvon pythonguy » Donnerstag 22. November 2007, 20:00

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

Beitragvon BlackJack » Donnerstag 22. November 2007, 20:14

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

Beitragvon rezeptor » Donnerstag 22. November 2007, 20:34

@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...
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Beitragvon rafael » Donnerstag 22. November 2007, 21:12

rezeptor
User
Beiträge: 8
Registriert: Dienstag 6. November 2007, 23:02

Beitragvon rezeptor » Donnerstag 22. November 2007, 23:54

@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...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 23. November 2007, 15:39

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 Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Freitag 23. November 2007, 16:05

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

Beitragvon BlackJack » Freitag 23. November 2007, 16:43

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

Beitragvon rezeptor » Freitag 23. November 2007, 21:13

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...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 24. November 2007, 10:33

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder