Seite 1 von 1
Python best practice
Verfasst: Freitag 20. März 2009, 11:31
von mzh
Hallo zusammen
Wie ist das eigentlich? Es scheint mir, als ob es in Python alles andere als ungewöhnlich ist, Klassendefinitionen und Funktionen zusammen ins gleiche Modul zu schreiben. Gibt es keine Gründe, die dafür sprechen würden, mindestens für jede Klasse ein eigenes Modul zu haben?
Ich habe bis jetzt nur mit Java gearbeitet und dort wird ja eher ein solcher Approach verfolgt. Es ist mir einfach noch ein bisschen unklar, welche Denkweise hier zum Zug kommt.
Besten Dank für Hinweise.
Re: Python best practice
Verfasst: Freitag 20. März 2009, 11:36
von Leonidas
mzh hat geschrieben:Es scheint mir, als ob es in Python alles andere als ungewöhnlich ist, Klassendefinitionen und Funktionen zusammen ins gleiche Modul zu schreiben. Gibt es keine Gründe, die dafür sprechen würden, mindestens für jede Klasse ein eigenes Modul zu haben?
Welche Gründe würdest du denn da sehen? Ich sehe einige die dagegensprechen.
mzh hat geschrieben:Ich habe bis jetzt nur mit Java gearbeitet und dort wird ja eher ein solcher Approach verfolgt. Es ist mir einfach noch ein bisschen unklar, welche Denkweise hier zum Zug kommt.
Die "Wir stecken alles in Klassen auch wenn es nur Funktionen sind"-Denkweise. Ich denke damit wollten die Sprachdesigner klarstellen dass Java OOP ist, aber persönlich halte ich den Ansatz für störend und ungelungen.
Verfasst: Freitag 20. März 2009, 11:38
von mzh
Nein, ich meine nicht, welche Denkweise bei Java angewendet wird, sondern eben hier in Python.
Für mich sieht es noch ungewöhnlich aus, wenn ich in einem Modul eine Funktion und eine Klasse auf der gleichen "Hierarchiestufe" stehen sehe, weil für mich stellen Klassen etwas dar, was den Funktionen übergeordnet sind (nach dem Motto: "Klassen können Funktionen haben, aber Funktionen können keine Klassen haben.")
PS: Mit "Hierarchie" oben soll indentation gemeint sein.
Re: Python best practice
Verfasst: Freitag 20. März 2009, 11:54
von gerold
mzh hat geschrieben:Gibt es keine Gründe, die dafür sprechen würden, mindestens für jede Klasse ein eigenes Modul zu haben?
Hallo mzh!
Gegenfrage: Warum soll man ein kleines Programm in mehrere Dateien aufteilen, wenn es keinen Grund dafür gibt? Und die Aussage "Jede Klasse gehört in eine eigene Datei." ist sicher kein Grund dafür.
Wenn das Programm wächst, dann kann man Teile des Programmes in Module auslagern. Die Klassen "Addresses" und "Address" würde ich z.B. gemeinsam in ein Modul packen. Auch die Funktionen "format_address" oder "get_countries_list" würden in das "adresses"-Modul passen. Der Hintergrund ist der, dass man nicht die Klassen importiert, sondern einen Kontainer (Modul, Paket) mit thematisch zusammengehörenden Funktionen, Konstanten und Klassen.
Die Denkweise ist dann die: Wenn ich Zugriff auf Adressen brauche, dann importiere ich mir das Modul/Paket "addresses". Alles was ich brauche ist dann dort vereint.
Es bleibt dir aber überlassen, wenn du dich damit wohler fühlst, die Klassen weiterhin in einzelne Module zu schreiben. Fasse sie aber zumindest in Pakete zusammen.
mfg
Gerold

Re: Python best practice
Verfasst: Freitag 20. März 2009, 12:09
von numerix
mzh hat geschrieben:Wie ist das eigentlich? Es scheint mir, als ob es in Python alles andere als ungewöhnlich ist, Klassendefinitionen und Funktionen zusammen ins gleiche Modul zu schreiben.
Das scheint dir richtig. Abgesehen von den Antworten in diesem Thread findest du im Forum schon einige weitere Threads zum Thema aus der letzten Zeit.
Wer ausreichend gründlich mit Java geimpft wurde, der tut sich gelegentlich schwer damit, die neue Freiheit von Python auch zu nutzen. Es ist gerade eine der Stärken von Python, dass man nicht auf OOP festgelegt ist, sondern auch mal rein imperativ/prozedural programmieren kann, was ja insbesondere bei kleinen Skripten sinnvoll ist. Oder man kombiniert beides - warum auch nicht. So lange der gesamte Code eine übersichtliche Struktur behält, spricht doch nichts dagegen.
Verfasst: Freitag 20. März 2009, 12:15
von Leonidas
mzh hat geschrieben:Nein, ich meine nicht, welche Denkweise bei Java angewendet wird, sondern eben hier in Python.
Das wäre die "wir stecken zusammengehörige Sachen in ein Modul"-Denkweise.
mzh hat geschrieben:(nach dem Motto: "Klassen können Funktionen haben, aber Funktionen können keine Klassen haben."
Das Motto stimmt aber gar nicht. Ich kann gut und gerne auch Klassen innerhalb von Funktionen definieren und mit ihnen ganz normal arbeiten.
Verfasst: Freitag 20. März 2009, 12:30
von Goswin
mzh hat geschrieben:Für mich stellen Klassen etwas dar, was den Funktionen übergeordnet sind (nach dem Motto: "Klassen können Funktionen haben, aber Funktionen können keine Klassen haben.")
Ich beobachte, dass innerhalb von Python-Funktionen durchaus Klassen definiert werden, sehe also nicht klar, was nun übergeordnet und was untergeordnet ist. (Ich selber habe bisher nur Funktionen innerhalb von Klassen benutzt, aber ich bin ja erst neu in Python)
Verfasst: Freitag 20. März 2009, 12:54
von lunar
mzh hat geschrieben:Nein, ich meine nicht, welche Denkweise bei Java angewendet wird, sondern eben hier in Python.
Gruppiere nach logischen Zusammenhängen zwischen Objekten, vielleicht ein bisschen so, wie Java die Pakete organisiert. Am Beispiel "java.io.*" wäre "io.py" ein Modul mit allerhand IO-Klassen und Funktionen, und "java" ein Paket, dass alle Module einer bestimmten Bibliothek gruppiert.
Für mich sieht es noch ungewöhnlich aus, wenn ich in einem Modul eine Funktion und eine Klasse auf der gleichen "Hierarchiestufe" stehen sehe, weil für mich stellen Klassen etwas dar, was den Funktionen übergeordnet sind (nach dem Motto: "Klassen können Funktionen haben, aber Funktionen können keine Klassen haben.")
Funktionen sind wie Klassen nur Objekte, und Klassen sind auch nicht irgendwie toller, schöner, besser oder cooler als Funktionen, sondern nur ein anderer Ansatz, der manchmal sinnvoll ist, manchmal aber eben auch nicht, vor allem nicht immer.
Verfasst: Samstag 21. März 2009, 03:30
von BlackJack
lunar's `io`-Beispiel in Python 3.0:
Code: Alles auswählen
bj@s8n:~$ python3.0
Python 3.0 (r30:67503, Dec 5 2008, 17:49:28)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import io
>>> from pprint import pprint
>>> pprint(dir(io))
['BlockingIOError',
'BufferedIOBase',
'BufferedRWPair',
'BufferedRandom',
'BufferedReader',
'BufferedWriter',
'BytesIO',
'DEFAULT_BUFFER_SIZE',
'FileIO',
'IOBase',
'IncrementalNewlineDecoder',
'Lock',
'OpenWrapper',
'RawIOBase',
'StringIO',
'TextIOBase',
'TextIOWrapper',
'UnsupportedOperation',
'_BufferedIOMixin',
'_BytesIO',
'_DocDescriptor',
'_StringIO',
'__all__',
'__author__',
'__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'_bytesio',
'_fileio',
'_stringio',
'abc',
'codecs',
'open',
'os']
Verfasst: Samstag 21. März 2009, 12:41
von DatenMetzgerX
[quote="mzh"
Für mich sieht es noch ungewöhnlich aus, wenn ich in einem Modul eine Funktion und eine Klasse auf der gleichen "Hierarchiestufe" stehen sehe, weil für mich stellen Klassen etwas dar, was den Funktionen übergeordnet sind (nach dem Motto: "Klassen können Funktionen haben, aber Funktionen können keine Klassen haben.")
PS: Mit "Hierarchie" oben soll indentation gemeint sein.[/quote]
Naja, Java hat ja auch anonyme Klassen, dann sind die Methoden den Klassen übergeordnet
