OOP - erste Fragen

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.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

Code: Alles auswählen

import os
import sys

class Ordner:
    def PIDPython(self):
        self.PID=os.getpid()
        return self.PID
    def Rechte(self,Pfad,mode):
        self.Rechte=os.chmod(Pfad,mode)
        return self.Rechte
    def Listen(self,Pfad):
        self.Listen=os.listdir(Pfad)
        return self.Listen
1. Stimmt dieser Code?
2. Wenn ja, ist mir self nicht ganz genau klar, was das sein soll. Im Buch wird das spärlich erklärt
3. Welches Onlinetutorial empfehlt ihr mir fürs OOP?

Immer diese Gerüchte, dass OOP so schwierig sei, stimmen wohl nich. Für mich erscheint das immer noch babyleicht :)
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Gary123456 hat geschrieben:Immer diese Gerüchte, dass OOP so schwierig sei, stimmen wohl nich. Für mich erscheint das immer noch babyleicht :)
Es ist nicht schwierig. Allerdings muss man die Ideen und Konzepte dahinter verstehen und korrekt anwenden und das hast du noch nicht.

Der Code ist so nicht korrekt. Als erstes stellt sich die Frage, warum man diese Funktionen überhaupt in einer Klasse bündeln sollte. Im Endeffekt haben sie keine gemeinsamen Daten die sie verwenden.

self ist übrigens das Exemplar (die Instanz) der Klasse mit der die Methode aufgerufen wird. Beim Aufruf selber wird sie nicht angegeben.

Schauen wir uns jetzt mal den Code an.

Code: Alles auswählen

    def Listen(self,Pfad):
        self.Listen=os.listdir(Pfad)
        return self.Listen
Hast du deinen Code eigentlich mal ausprobiert? Anscheinend nicht. Das ist jetzt nämlich ein schönes Beispiel dafür wie man sich selber in den Fuß schießen kann. Innerhalb der Methode Listen definierst du Listen neu als Liste. Damit ist die Methode Listen nicht mehr erreichbar.

Code: Alles auswählen

folder = Ordner()
print(folder.Listen('.'))
print(folder.Listen('.'))
Beim zweiten Aufruf bekommst du einen Fehler.

Code: Alles auswählen

TypeError: 'list' object is not callable
Der Grund sollte klar sein. Wenn du mal vor jedem print noch eine Zeile mit

Code: Alles auswählen

print(type(folder.Listen))
einfügst, dann siehst du es auch. Zuerst ist folder.Listen <type 'instancemethod'>, danach <type 'list'>.


Zum Schluss darf dann auch der Hinweis auf PEP-8, den Style Guide for Python Code, nicht fehlen. Es steht dir selbstverständlich frei zu schreiben wie du möchtest, aber wenn du Code mit anderen austauschst - oder anderen zum Drüberschauen vorlegst - dann hat es deutliche Vorteile wenn du dich an den allgemein verwendeten Stil hältst.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Aus der Sicht eines Hobbyisten: Du fängst an, OOP zu verstehen, wenn Du weißt, wann Du darauf verzichten sollst.

Die meisten Bücher und Tutorials, die ich bisher gesehen habe, beschreiben sehr gut, wie man Klassen definiert und verwendet (Lieblinge wie Fahrzeuge, Konten, Tiere. etc.). Was mir bisher jedoch immer gefehlt hat, war eine Art Leitlinie oder Kanon, wann man Klassen einsetzt oder eben gerade nicht.

Vielleicht hat hier jemand was passendes parat?

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

bwbg hat geschrieben:Was mir bisher jedoch immer gefehlt hat, war eine Art Leitlinie oder Kanon, wann man Klassen einsetzt oder eben gerade nicht.
Z.B.: Wenn Du feststellst, dass Methoden einer Klasse nicht zwingend Instanz-Variablen (Attribute) anwenden - sich also Informationen teilen oder einen Status merken müssen, dann kannst Du diese auch als Funktionen implementieren. Sobald Du aber feststellst, dass Du bei dem Einsatz von Funktionen globals brauchst, dann solltest Du Klassen einsetzten. Das ist aber nur eine Teilantwort, denn es gilt immer noch: OOP lernt man am besten, indem man jemanden zuschaut, der es kann.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Naja bei mir ist es unsicher. Viele hier sagen, dass in der neuesten Ausgabe von dem Galileo Computing Python Buch nur Dreck verzählt wird. Nun - was soll ich machen? Anderes Tutorial? Bis jetzt hat mir eig alles gefallen (außer das es kleinere Fehler gibt)
BlackJack

@Gary123456: Die Frage ist ja nicht ob es Dir gefällt, sondern ob idiomatisches Python gelehrt wird. Vielleicht gefällt Dir OOP ja auch auch wie es dort im Buch beschrieben wird. Das macht es nicht besser.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ouh Missverständnis. Ich habe gedacht, da wird falsches Zeug vermittelt.
BlackJack

@Gary123456: Wird es ja auch.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Was denn zum Beispiel?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Zum Destruktor: Die Angaben zum Destruktor sind grob fahrlaessig und vermitteln, dass man den benutzen kann. Der Umstand, dass das nicht oft getan wird, wird mit "in Python braucht man nicht selbst saubermachen" weggebuegelt. Dass ein Destruktor u.U. Probleme verursachen kann, die noch dazu mit "obskuren" Fehlermeldungen garniert sind wird komplett weggelassen.

Danach geht es weiter mit der Idee, dass es in Python Zugriffskontrolle ala C++ und Java gaebe, der Verbreitung von Gettern und Settern ...

BlackJack hat das vor einiger Zeit mal zusammengefasst: http://blog.marc.rintsch.de/2012/11/18/ ... nbook.html

Auch wenn du AFAIR das Python3 Buch nutzt, habe ich keine grossen Hoffnungen dass die Autoren es besser machen (es ist dasselbe Autorenpaar).
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

OK Danke - werde ich mir zu Herzen nehmen.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Gefält euch das besser: http://www.python-kurs.eu/klassen.php ?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gary123456: die Seite http://www.python-kurs.eu/klassen.php wiederholt den gleichen Quatsch wie das Galileo-Buch.
Die Einführung hat nichts mit Python zu tun, sondern passt besser zu einer Java-Klasssen-Einführung.
Es hält sich nicht an PEP8, behauptet, es wäre schlecht auf Attribute direkt zuzugreifen und erfindet private Attribute.
Destruktoren werden wirklich von 99.9% der Python-Programmierer nie und vom Rest fast nie gebraucht.
Warum dann in einer Einführung überhaupt erwähnen, zumal die korrekte Benutzung äußerst kompliziert ist?
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Da ich nicht sehe, dass ihr mir schon ein Buch empfohlen hättet, eine Frage: Gibt es speziell für OOP ein Tutorial frei zugänglich im Internet.
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Gary123456 hat geschrieben:Da ich nicht sehe, dass ihr mir schon ein Buch empfohlen hättet, eine Frage: Gibt es speziell für OOP ein Tutorial frei zugänglich im Internet.
Speziell zur Objektorientierung in Python 3 gibt es etwa http://www.packtpub.com/python-3-object ... mming/book
Das ist aber nicht umsonst.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich will was kostenloses. Ich geb nicht wieder Geld aus für ein Buch.
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich denke du kannst ruhig OOP mit Hilfe von Python Das Umfassende Handbuch verstehen lernen. Ich habe das Buch nicht gelesen, hier ist BlackJacks Buchkritik (Link) das könntest du mal lesen.

Ich habe Python fast ausschließlich anhand des Python Tutorials gelernt, ich weiß nicht ob dir das hilft. Hier ist eine Übersetzung die cofi hier aus dem Forum betreut: Link.

mfG
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Sehr gut! Vielen Dank! Nun - aus einem anderen Forum wurde mir dieses Buch deutlichst empfohlen. Hier eher nicht. Dann ist die Frage: Waren die 40 Euro umsonst?
lunar

@Gary123456 Ich würde sagen, ja, die 40 € waren umsonst. Was Dir dieses Buch beibringt, das kannst Du auch genauso gut aus frei im Internet verfügbaren Quellen erlernen. In welchem Forum wurde Dir dieses Buch denn sogar „deutlichst“ empfohlen?

Eine gute Quelle ist Learn Python The Hard Way, welches im letzten Teil auch objektorientierte Programmierung lehrt. Der Ansatz dieses Buchs ist ungewöhnlich, da es sehr viel Wert auf Übung legt, doch da man Programmierung vor allem durch Üben lernt, ist es sehr empfehlenswert.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hier wurde es mir empfohlen: http://www.computerbase.de/forum/showth ... ?t=1179468

Die Frage ist ja, ob dieses umfassende Handbuch nur in OOP sinnloses Zeug vermittelt oder auch an anderen Stellen?

Werde mir das Buch "Learn Python on the hard way" mal ansehen.
Antworten