Datenstruktur: Table Class

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
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Häufig brauche ich ein Design Pattern um folgende Datenstruktur mittels Klassen darzustellen:

Zum Beispiel "Adressbuch": eine Klasse "Persons" besteht aus einer Liste von Personen. Ein Listeneintrag ist eine Instanz der Klasse "Person". Diese Klasse enthält eine flache Struktur, z.B. "Name, Alter". Hier ein Beispiel wie ich so etwas immer mache:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class Person():
	def __init__(self, name, age):
		self.name = name
		self.age = age

class Persons():
	def __init__(self):
		self.person = []

	def add(self, name, age):
		self.person.append(Person(name, age))

	def show_all(self):
		for person in self.person:
			print person.name, person.age

def main():
	person = Persons()
	person.add('Ralf', 46)
	person.add('Martina', 44)
	person.show_all()

if __name__ == '__main__': main()
Nun meine Frage, ist das so korrekt oder macht man das anders?
BlackJack

@rhersel: Sieht soweit in Ordnung aus. Ist ein wenig weit eingerückt -- mehr als vier Leerzeichen pro Ebene.

Ich würde die Klassen von `object` ableiten oder die Klammern weglassen. Einfach leere Klammern sind unüblich. Hätte jetzt noch nicht einmal gewusst, dass das syntaktisch überhaupt geht.

Der `Persons`-Klasse könnte man noch eine `__len__()`- und eine `__iter__()`-Methode verpassen. Dann könnte man in `show_all()` zum Beispiel einfach ``for person in self:`` schreiben.

Wenn `Person` nicht nur intern verwendet wird, sondern man die Objekte auch "rausgibt", dann hätte ich der `add()`-Methode wohl nicht die "Einzelteile" sondern auch `Person`-Objekte als Argument verpasst. Sonst wäre die API ein wenig asymmetrisch.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Besten Dank. Jetzt bin ich beruhigt, dass es nicht völlig falsch ist.
deets

Ich wuerde noch die Eigenschaft "person" der Klasse Persons umbenennen - zB in "persons", oder "entries", wenn's denn Englisch sein darf.

Denn ein Singular bei der Benennung einer Eigenschaft impliziert, dass da eben nur *ein* Ding drin ist.

Und bei der konkret sehr schmalen Implementierung von Persons braucht man es ja eigentlich nicht, sondern eine normale Liste reicht aus. Aber ich denke mal, die soll mit der Zeit noch wachsen.. ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Ich würde die Klassen von `object` ableiten oder die Klammern weglassen. Einfach leere Klammern sind unüblich. Hätte jetzt noch nicht einmal gewusst, dass das syntaktisch überhaupt geht.
Das wurde auch etwas später hinzugefügt. Ursprünglich, als die Vererbungssyntax eingeführt wurde ging das tatsächlich nicht. Aber ich habe jetzt auch keine Lust zu graben wann das hinzugekommen ist ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Darf ich noch anmerken, dass der Plural von Person eigentlich People ist? Um diesen unregelmäßigen Substantiven dem Weg zu gehen, wäre vielleicht ein Namen wie PersonList oder PersonTable (wenn es relational sein soll) besser. Und zur Zeit der OO-Datenbanken bezeichnete man die Menge aller persistenten Exemplare einer Klasse als Extent, also dann PersonExtent.

Stefan
Antworten