Wenn ich ein Django Model baue, benötige ich keine __init__?

Django, Flask, Bottle, WSGI, CGI…
Antworten
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Sehe ich das richtig, dass wenn ich meine Django Modelle in einer SQLite3 Datenbank verwalte, dass ich dann für die Modelle keine __init__ Methode definiere?
[url=http://www.proandkon.com]proandkon.com[/url]
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@mzh: das hat nichts mit der dahinterliegenden Datenbank zu tun. Die Erzeugung der Modell-Instanzen übernimmt das Django-ORM, die Elternklasse (Model) hat also schon eine __init__-Methode.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mzh: Falls dir das nicht bereits bekannt sein sollte: Eine ``__init__``-Methode wird von Python auf jeden Fall aufgerufen, wenn ein Exemplar des Objektes erstellt wird. Wenn du keine eigene ``__init__``-Methode definiert hast, dann wird die ``__init__``-Methode der Elternklasse genommen. Falls nicht explizit eine Elternklasse angegeben wurde, dann wird eine Standardimplementierung verwendet, die für alle Objekte gilt. Eine in Python erstellte Klasse muss also niemals zwingend eine eigene ``__init__``-Methode mitbringen.

Generell sollte eine ``__init__``-Methode nur dann definiert werden, wenn man bei der Instanziierung eines Klassenexemplars auch tatsächlich etwas verändern / festlegen möchte. Ein häufiges Beispiel ist die Initialisierung von Attributen für das Exemplar (und die gehört auch definitiv da rein und nicht irgendwo an eine spätere Stelle innerhalb der Klasse). Ein häufiges Beispiel, wo man aber mitunter *keine* ``__init__``-Methode schreiben möchte, ist beim Ableiten von einer Elternklasse. Je nach Schnittstelle ist dann oftmals das Überschreiben bestimmter (möglichst) generisch gehaltener Methoden oder das Definieren von *Klassen*attributen möglich, um das Verhalten des eigenen Exemplars im Gesamtsystem (aka Bibliothek / Framework) zu beeinflussen. Gerade in Webframeworks und Datenbank-ORMs wird gerne der Weg über Klassenattribute gegangen.

Und noch ein Hinweis: In Fällen, wo man in der abgeleiteten Klasse eine eigene ``__init__``-Methode definiert, ist es in der Regel sinnvoll, die ``__init__``-Methode der Elternklasse (die man ja dadurch überschrieben hat) nochmal explizit aufzurufen. Ansonsten ist die Wahrscheinlichkeit hoch, dass das erzeugte Exemplar nicht komplett initialisiert wurde und dadurch ein höchst unvorhersehbares Verhalten zeigt (meistens wohl Exceptions bei diversen Methodenaufrufen).
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Sirius3 hat geschrieben:@mzh: das hat nichts mit der dahinterliegenden Datenbank zu tun. Die Erzeugung der Modell-Instanzen übernimmt das Django-ORM, die Elternklasse (Model) hat also schon eine __init__-Methode.
Dass die Datenbank und die Objekte per se nichts direkt miteinander zu tun haben war mein Verdacht.

Danke für den Hinweis, dass die Elternklasse schon die __init__ Methode liefert.
[url=http://www.proandkon.com]proandkon.com[/url]
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

snafu hat geschrieben:@mzh:
Und noch ein Hinweis: In Fällen, wo man in der abgeleiteten Klasse eine eigene ``__init__``-Methode definiert, ist es in der Regel sinnvoll, die ``__init__``-Methode der Elternklasse (die man ja dadurch überschrieben hat) nochmal explizit aufzurufen. Ansonsten ist die Wahrscheinlichkeit hoch, dass das erzeugte Exemplar nicht komplett initialisiert wurde und dadurch ein höchst unvorhersehbares Verhalten zeigt (meistens wohl Exceptions bei diversen Methodenaufrufen).
Sehr guter Hinweis. Mir erschien es anfangs einfach so, als ob alle Attribute als Klassenattribute definiert wurden (weil sie ja eben nicht per __init__ definiert werden). Dann merkte ich, dass man auf die Attribute des Objektes doch über
Class.objects.get(pk=xy).attribut
zugreifen kann.
[url=http://www.proandkon.com]proandkon.com[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

mzh hat geschrieben:Sehr guter Hinweis. Mir erschien es anfangs einfach so, als ob alle Attribute als Klassenattribute definiert wurden (weil sie ja eben nicht per __init__ definiert werden). Dann merkte ich, dass man auf die Attribute des Objektes doch über
Class.objects.get(pk=xy).attribut
zugreifen kann.
Das schließt sich - unabhängig von Django - ja auch nicht aus; wenn du Klassenattribute definierst sind sie auch über die Klasseninstanzen zugreifbar.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten