Python best practice

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Freitag 20. März 2009, 11:31

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.
[url=http://www.proandkon.com]proandkon.com[/url]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 20. März 2009, 11:36

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Freitag 20. März 2009, 11:38

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.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 20. März 2009, 11:54

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 20. März 2009, 12:09

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

Freitag 20. März 2009, 12:15

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Goswin
User
Beiträge: 361
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen

Freitag 20. März 2009, 12:30

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)
lunar

Freitag 20. März 2009, 12:54

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.
BlackJack

Samstag 21. März 2009, 03:30

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']
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Samstag 21. März 2009, 12:41

[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 ;)
Antworten