[Django] Objekt erstellen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

Hallo liebe Community,

ich habe mal wieder eine winzig kleine Frage an euch :)
Wenn ich z.B. so einen ausdruck habe:

Code: Alles auswählen

    def getAGB(self):
        try:
            site = GameSites.objects.get(name = 'agb');
            return site;
        except GameSites.DoesNotExist:
            return False;
dann erstelle ich doch mit site ein Objekt oder?!
Ich habe nun aber keinerlei Möglichkeit dieses Objekt zu löschen mittels der Anweisung "del". Macht das Django evtl. sogar automatisch?!

Ich könnte es natürlich auch so schreiben:

Code: Alles auswählen

    def getAGB(self):
        try:
            site = GameSites.objects.get(name = 'agb');
            url = site.url;
            active = site.active;
            del site;
            return {'url': url, 'active': active};
        except GameSites.DoesNotExist:
            return False;
Das ich hinter den Anweisungen kein Semilkolon machen muss, weis ich... Habe es mir aber durch andere Programmiersprachen wie C, C++, Java usw angewöhnt!

Meine Befürchtung ist nur, dass der RAM irgendwann überläuft, wenn ich die Objekte nicht lösche.

Mfg
Berliner
Zuletzt geändert von BerlinerMC am Sonntag 2. August 2009, 15:29, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BerlinerMC hat geschrieben:dann erstelle ich dich mit site ein Objekt oder?!
Jein. Du holst einen Eintrag aus der Datenbank und erstellst ein Objekt.
BerlinerMC hat geschrieben:Ich habe nun aber keinerlei Möglichkeit dieses Objekt zu löschen mittels der Anweisung "del". Macht das Django evtl. sogar automatisch?!
Aus der Datenbank oder aus dem RAM?

Ich könnte es natürlich auch so schreiben:

Code: Alles auswählen

    def getAGB(self):
        try:
            site = GameSites.objects.get(name = 'agb');
            url = site.url;
            active = site.active;
            del site;
            return {'url': url, 'active': active};
        except GameSites.DoesNotExist:
            return False;
BerlinerMC hat geschrieben:Das ich hinter den Anweisungen kein Semilkolon machen muss, weis ich... Habe es mir aber durch andere Programmiersprachen wie C, C++, Java usw angewöhnt!
Das ist keine Ausrede. Man sollte Sprachen idiomatisch schreiben.
BerlinerMC hat geschrieben:Meine Befürchtung ist nur, dass der RAM irgendwann überläuft, wenn ich die Objekte nicht lösche.
Python hat einen GC.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

Leonidas hat geschrieben:
BerlinerMC hat geschrieben:dann erstelle ich dich mit site ein Objekt oder?!
Jein. Du holst einen Eintrag aus der Datenbank und erstellst ein Objekt.
BerlinerMC hat geschrieben:Ich habe nun aber keinerlei Möglichkeit dieses Objekt zu löschen mittels der Anweisung "del". Macht das Django evtl. sogar automatisch?!
Aus der Datenbank oder aus dem RAM?
Wie ich einen DS aus der DB lösche ist mir schon klar :)
Ich rede von dem Objekt!
Leonidas hat geschrieben:
BerlinerMC hat geschrieben:Meine Befürchtung ist nur, dass der RAM irgendwann überläuft, wenn ich die Objekte nicht lösche.
Python hat einen GC.
GC = Garbage Collection?!
Das heist also das das löschen von Ojekten nur zu meiner Sicherheit dient, aber das Objekt auch automatisch gelöscht wird von Python?!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BerlinerMC hat geschrieben:Wie ich einen DS aus der DB lösche ist mir schon klar :)
Ich rede von dem Objekt!
Das wird automatisch gelöscht wenn die letzte Referenz darauf gelöscht wird. Da musst du nix spezielles machen.
BerlinerMC hat geschrieben:GC = Garbage Collection?!
Das heist also das das löschen von Ojekten nur zu meiner Sicherheit dient, aber das Objekt auch automatisch gelöscht wird von Python?!
Das heißt dass dein Gebrauch von ``del`` nicht deiner Sicherheit dient sondern vollständig überflüssig ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

Leonidas hat geschrieben: Das heißt dass dein Gebrauch von ``del`` nicht deiner Sicherheit dient sondern vollständig überflüssig ist.
Okay das nehme ich mal so hin :D
Vielen Dank Leonidas.

Passt zwar jetzt nicht in diesem Bereich und meine Frage / Sorgen wurden somit beantwortet, aber warum gibt es denn die Anweisung "del" bzw einen Destruktor?!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

BerlinerMC, da du das Semikolon ja auch von Java zu kennen glaubst, solltest du wissen, dass man dort keine Objekte löschen kann. Das übernimmt das Laufzeitsystem für dich. In Python ist es genau so. Vergiss nicht nur das `;`, sondern auch auch, dass es `del` gibt. Ach, und vergiss auch C oder Java und lerne Python unvoreingenommen ;)

Mir erscheint es auch ein sehr merkwürdiges Design, dass eine Funktion entweder ein `GameSites`-Exemplar oder `False` liefert. Wieso nicht `None` als Zeichen für die Abwesenheit eines Objekts. Und warum heißt dieses Exemplar im Plural. Wäre nicht `GameSite` besser? Und selbst dann, heißt `agb` etwa "Allgemeine Geschäftsbedingungen"? Das wäre ein komisches Spiel. Was sucht das dort? Oder ist das etwas wie "Advanced Galaxy Besieger"?

Noch merkwürdiger ist die zweite Variante von `getAGB`. Strukturierte Daten kann man durchaus auch mit Klassen modellieren. In diesem Fall wäre aber IMHO ein Tupel besser geeignet, weil man doch bestimmt an der Aufrufstelle etwas wie `url, active = getAGB()` machen will. Das verbaust du dir durch das Dictionary.

Stefan
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

sma hat geschrieben:BerlinerMC, da du das Semikolon ja auch von Java zu kennen glaubst, solltest du wissen, dass man dort keine Objekte löschen kann. Das übernimmt das Laufzeitsystem für dich. In Python ist es genau so. Vergiss nicht nur das `;`, sondern auch auch, dass es `del` gibt. Ach, und vergiss auch C oder Java und lerne Python unvoreingenommen ;)
So sei es :P
sma hat geschrieben:Mir erscheint es auch ein sehr merkwürdiges Design, dass eine Funktion entweder ein `GameSites`-Exemplar oder `False` liefert. Wieso nicht `None` als Zeichen für die Abwesenheit eines Objekts. Und warum heißt dieses Exemplar im Plural. Wäre nicht `GameSite` besser? Und selbst dann, heißt `agb` etwa "Allgemeine Geschäftsbedingungen"?


Das Objekt welches er zurückgibt wird von einem Template ausgelesen und ggf angezeigt. Durch ein IF Anweisung in dem Template kam ich zu dem Entschluss False zurückzugeben. Warum ich dieses "Exemplar" nun in Plural und nicht in Singular geschrieben habe... Wollen wir uns darüber nicht streiten.
Aber es liegt daran das dieses "Exemplar" noch mehr Seiten prüft als nur diese eine. Also es gibt noch Funktionen wie getBoard()... usw.
Ob dieses verfahren gut geeignet ist oder nicht, weis ich immoment noch nicht.
Mir selber zerbricht es auch den Kopf. Jedoch finde ich es besser / Sinnvoller die AGB's in der DB zu ändern als immer wieder das Template anzurühren!
sma hat geschrieben:Das wäre ein komisches Spiel. Was sucht das dort? Oder ist das etwas wie "Advanced Galaxy Besieger"?


Was soll das sein?!
sma hat geschrieben:Noch merkwürdiger ist die zweite Variante von `getAGB`. Strukturierte Daten kann man durchaus auch mit Klassen modellieren. In diesem Fall wäre aber IMHO ein Tupel besser geeignet, weil man doch bestimmt an der Aufrufstelle etwas wie `url, active = getAGB()` machen will. Das verbaust du dir durch das Dictionary.

Stefan


Möcht ich nicht. Siehe oben es dient für ein Template welches mit Dict arbeitet
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Templates in der Datenbank zu verwalten kann schon sinnvoll sein. Aber sind das wirklich Templates im Django-Sinn? Oder ist es eher der Inhalt der Seite? Den Text der AGBs würde ich schon in die DB packen. Wie dieser aber dargestellt wird, könnte etwas sein, dass man unabhängig davon ändern können will. Django wählt dafür das Dateisystem, weil es so einfacher für Entwickler ist, den ganzen HTML/Template-Krams zu editieren.

`None` gilt übrigens (genau wie leere Listen, Dicts, Sets, Tupel und Strings) als falsch. Und weil C es schon so gemacht hat, steht auch 0 für falsch.

Advanced Galaxy Besieger ist ein Name der wie ein Spiel klingt und den man als AGB abkürzen könnte. Oder meinst du mit "Game" die Jagdfauna und das ganze soll eine Website für Waidmänner werden? ;)

Stefan
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

sma hat geschrieben: `None` gilt übrigens (genau wie leere Listen, Dicts, Sets, Tupel und Strings) als falsch. Und weil C es schon so gemacht hat, steht auch 0 für falsch

Stefan
Also schliesse ich daraus das None besser ist als False in dem Falle?!

Ich gebe nun zurück

Code: Alles auswählen

return {'url': '', 'active': False }
So hatte ich das gestern Abend dann noch gelöst. Aber wenn None ausreicht dann nehme ich natürlich lieber das :)
sma hat geschrieben:Advanced Galaxy Besieger ist ein Name der wie ein Spiel klingt und den man als AGB abkürzen könnte. Oder meinst du mit "Game" die Jagdfauna und das ganze soll eine Website für Waidmänner werden? ;)
Nein AGB stand schon für Allgemeine Geschäftsbedingung.
Ich habe damals ein Browsergame in php geschrieben und möchte es nun reprogrammieren auf der Basis von Django / Python und PostgreSQL
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Naja, False macht mehr Sinn, wenn man es zusammen mit True verbindet (entweder True oder False). Erwartest du ein Objekt, dann ist None verständlicher (entweder das Objekt oder "Nichts").
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

jbs hat geschrieben:Naja, False macht mehr Sinn, wenn man es zusammen mit True verbindet (entweder True oder False). Erwartest du ein Objekt, dann ist None verständlicher (entweder das Objekt oder "Nichts").
Ja dann True / False...
Antworten