Abspeichern von Daten in OO-Version?

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 17. Dezember 2004, 22:49

Ich muß leider nochmal nachfragen zum Thema speichern von Daten...

Natürlich haben wir schon zwei Beispiele, wie man Datei-/Verz-Daten abspeichert:
http://python.sandtner.org/viewtopic.php?p=13328
http://python.sandtner.org/viewtopic.php?p=13299

Aber so richtig zufrieden bin ich damit nicht...

Hier mal eine neue Beispiel-Struktur:

Code: Alles auswählen

[
{ "name":"datei1.exe",   "parentID":0,"FileInfo":"EXE-File"     },    # Datei1 im ROOT
{ "name":"Verz1",        "parentID":0                           },    # Verz1 im ROOT
{ "name":"datei2.7z",    "parentID":2,"FileInfo":"7-Zip-Archiv" }     # Datei2 im \Verz1\
]
Ein Nachteil sehe ich in der verschwendung von Speicher :(
Ich meine, für jede Datei/Verz. wird ein neues Dict eingerichtet. Dabei sind die meißten, aber nicht alle, Keys die selben... Jedoch denke ich, weiß das der Python-Interpreter nicht, denn für ihn ist jedes Dict ein völlig anderes... Auch wenn die "verschwendung" jetzt nich enorm ist, ist es doch unnütz...

Mir ist dabei eingefallen, ich könnte ja einfach eine Liste aller KeyNamen machen und im Dict nur die Positions-Nummer abspeichern...

Aber irgendwie muß es doch auch anders gehen, halt ObjektOrientiert. Auch in Hinblick auf eine OODB ;)
Zuletzt geändert von jens am Freitag 17. Dezember 2004, 23:03, insgesamt 1-mal geändert.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 17. Dezember 2004, 23:00

Hier ein erster Ansatz:

Code: Alles auswählen

class itemInfo(dict):
    def setName(self, Name):
        self.Name = Name

    def setFileInfo( self, FileInfo ):
        self.FileInfo = FileInfo

    def getName(self):
        return self.Name

    def getFileInfo(self):
        return self.FileInfo

DirInfo = []
DirInfo.append( itemInfo() )
DirInfo[-1].setName("datei1.exe")
DirInfo[-1].setFileInfo("EXE-File")
DirInfo.append( itemInfo() )
DirInfo[-1].setName("Verz1")

DirInfo.append( itemInfo() )
DirInfo[-1].setName("datei2.7z")
DirInfo[-1].setFileInfo("7-Zip-Archiv")

for i in DirInfo:
    print i.getName(), i.getFileInfo()
Es kommt natürlich zu einem Traceback, weil es bei "Verz1" keine FileInfo gibt...
Natürlich kann ich das einfach umgehen, wenn ich bei __init__ schon mal alle "Werte" auf "" setzte...

Außerdem ist es alles doof, weil eine interation viel zu umständlich ist...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Samstag 18. Dezember 2004, 02:54

Hi jens,

jo warum einfach wenns auch kompliziert geht ;)

Code: Alles auswählen

key_name = "name"
key_parent_id = "parent_id"
key_fileinfo = "FileInfo"

[
{ key_name : "datei1.exe",   key_parent_id : 0, key_fileinfo : "EXE-File"     },    # Datei1 im ROOT
{ key_name : "Verz1",        key_parent_id : 0                                },    # Verz1 im ROOT
{ key_name : "datei2.7z",    key_parent_id : 2, key_fileinfo : "7-Zip-Archiv" }     # Datei2 im \Verz1\
]
So werden nur Referenzen der Schlüssel gespeichert.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 20. Dezember 2004, 07:50

Genau daran hatte ich ja auch gedacht, nur nicht mit einer Referenz mit einem String, sondern mit einer Zahl, aber das kommt ja auf's gleiche raus...
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 23. Dezember 2004, 16:51

Dookie hat geschrieben:So werden nur Referenzen der Schlüssel gespeichert.
So, jetzt hab ich es gerade mal getestet... Es wird nicht eine Referenz gespeichert, sondern der String selbst... :(
Also doch besser Nummern verwenden, damit der Speicherverbrauch gering ist?

Also besser so:

Code: Alles auswählen

key_name = 0
key_parent_id = 1
key_fileinfo = 2

[
{ key_name : "datei1.exe",   key_parent_id : 0, key_fileinfo : "EXE-File"     },    # Datei1 im ROOT
{ key_name : "Verz1",        key_parent_id : 0                                },    # Verz1 im ROOT
{ key_name : "datei2.7z",    key_parent_id : 2, key_fileinfo : "7-Zip-Archiv" }     # Datei2 im \Verz1\
] 
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 23. Dezember 2004, 20:02

komisch ich habs gerade auch getestet und da werden nur referenzen verwendet:

Code: Alles auswählen

>>> key_name = "name"
>>> key_parent_id = "parent_id"
>>> key_fileinfo = "FileInfo"
>>> liste = [
{ key_name : "datei1.exe",   key_parent_id : 0, key_fileinfo : "EXE-File"     },    # Datei1 im ROOT
{ key_name : "Verz1",        key_parent_id : 0                                },    # Verz1 im ROOT
{ key_name : "datei2.7z",    key_parent_id : 2, key_fileinfo : "7-Zip-Archiv" }     # Datei2 im \Verz1\
] 
>>> print liste[0].keys()
['parent_id', 'FileInfo', 'name']

>>> print liste[0].keys()[0] is key_parent_id
True

>>> print liste[1].keys()[0] is key_parent_id
True

>>> print liste[2].keys()[1] is key_fileinfo
True

>>> print liste[0].keys()[0] is "%s" % "parent_id" # neue Instanz!
False

>>> print liste[0].keys()[0] is "parent_id" # keine neue Instanz!!!
True

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 23. Dezember 2004, 21:24

Hmm... Ich hab's mit type() getestet... Dabei kam raus, das es ein str() ist... Ich dachte dabei müßte irgendwas mit Intanz sein... Dann hast du wohl recht...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 23. Dezember 2004, 21:40

Nö mit type() bekommst Du immer den Type bzw die Klasse einer Instanz. Mit is kann man auf identität von Instanzen prüfen.

Code: Alles auswählen

>>> a = 100

>>> b = 100

>>> print a is b
False

>>> a = 99

>>> b = 99

>>> print a is b
True
bemerkenswert oder?
Bei Test auf None, True und False kann und sollte man auch is verwenden, da es von diesen Werten immer nur eine Instanz gibt und der Test mit is schneller ist als ein Vergleich mit ==.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 24. Dezember 2004, 13:59

Verstehe ich nicht, warum ist der zweite nicht auch False???
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Freitag 24. Dezember 2004, 14:35

Weil kleine Zahlen sehr oft gebraucht werden, hat Python die Zahlen -5 bis 99 (bei Python2.3) schon vorab als Instanzen gespeichert. So braucht für diese oft benötigten Zahlen kein neues Objekt erzeugt werden.


Frohe Weichnachten

Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten