prinzipielle Entscheidung: Dictionary oder eigene Klasse?

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
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

Hallo!

Mein neues Projekt soll ein Lernkartei-Programm werden und ich stehe aktuell vor der Entscheidung in welcher Form ich die einzelnen Lernkarten abspeichere.

als Klasse:

Code: Alles auswählen

class Card(object):
	def __init__(self, front, back):
		self.front_content = front
		self.back_content = back
		self.create_time = time.time()	

#die Zeit, die eine Karte zum lernen angezeigt wird soll individuell sein:
		self.time_to_learn = len(back) + len(front) 
Vorteil der Klasse: flexibler, da ich bei Bedarf individuelle Methoden schreiben könnte


oder als Dictionary:

Code: Alles auswählen

new_card = {"front_content" : "..." , "back_content" : "..." , "create_time" : "...", "time_to_learn" : "..."}
Vorteil des Dictionary: jede Menge Standard-Methoden stehen zur Verfügung

Was fallen euch noch für Argumente ein?

Viele Grüße, Werner
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Du kannst auch von ``dict`` erben und dort eigene Methoden implementieren.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die Frage ist doch, inwiefern ein Lernkartenobjekt selber Funktionalität besitzen können soll? Evtl. gibt es Werte, die immer wieder gebraucht werden, aber die direkt von anderen Werten abhängig und berechenbar sind. Dafür böten sich dann Properties an - das ist sicher schicker, als für einen Wert eine Funktion mit dem Dict als Parameter aufzurufen. Dein `time_to_leran` wäre dafür imho prädestiniert.

Auch eine eigene `__str__`-Methode kann ja schon ein Vorteil sein ;-)

Das Argument mit den "Standardmethoden" kapiere ich jetzt nicht wirklich. Wie meinst Du das genau?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

@Hyperion: Da es ein reines Lernprojekt (im doppelten Sinn) für mich ist, möchte ich schon die Möglichkeit offen halten dem Lernkartenobjekt noch eigene Funktionalität zu geben.

mit Standardmethoden meine ich sowas wie "key in dict" http://docs.python.org/library/stdtypes ... pesmapping welche mir ja zur Verfügung stehen würden, wenn ich meine Klasse von ''dict'' erben lasse, wie von jbs vorgeschlagen.

PS: ich hab grad mal nachgesehen, die Anzahl der Standardmethoden für ein dict ist recht überschaubar, oder überseh ich da was?
deets

Ich wuerde ein eigenes Objekt dafuer implementieren - von dict zu erben bringt dir nur dann was, wenn es fuer die Karteikarte wirklich wichtig ist, beliebige Key/Values zu beinhalten. Das sehe ich jetzt nicht.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sobald du heterogene Werte hast würde ich ein namedtuple oder eine Klasse verwenden.
mcdwerner
User
Beiträge: 113
Registriert: Donnerstag 7. Juli 2011, 14:27

Danke für die Antworten!

Von den "dict-Standard-Methoden" hab ich mir wahrscheinlich zu viel erwartet...

Ich werde flexibel bleiben, als Klasse implementieren und bei weiteren Fragen mich einfach wieder hier melden.

(Bin immer wieder begeistert vom Forum!)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Du kannst diese "dict-Standard-Methoden" auch in deiner Klasse implementieren. "key in dict" wird zu dict.__contains__(key), d.h. du musst nur die __contains__-Methode implementieren. Lektüre: http://docs.python.org/reference/datamo ... iner-types
the more they change the more they stay the same
Antworten