Bücherregal sortieren

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
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hallo Leute, ich will etwas Ordnung in die Büchersammlung bringen. Manche Bücher gibt es nur als eBook, manchmal als Ausdruck des eBooks, manchmal als gebundene Version, oder beliebige Vielfache davon. Deshalb unterscheide ich "Buch" (abstrakter Inhalt) und "Version" (Manifestation des Inhalts). Ich weiß nicht, ob ich damit auf einem gutem Weg bin. Wie würdet ihr es machen? Ziel soll sein, Inventur machen zu können und am Ende sehen zu können, welche Bücher in welchen Versionen in welchen Buchregalen vorhanden sind oder ggf. noch fehlen. Eine Bedienung per Website-Rumklickerei wäre nett, aber das habe ich erst mal zurückgestellt, bis die Logik soweit funktioniert.

Hier mein erster Code Entwurf:

Code: Alles auswählen

class Author(object):
    def __init__(self, name):
        self.name = name


class Book(object):
    def __init__(self, title, author):
        self.title = title
        self.author = author
        self.versions = []

    def displayBook(self):
        print "Title: %s - Author: %s" % (self.title, self.author.name )
        if len(self.versions) > 0:
            print "%d versions known:" % len(self.versions)
            for i, v in enumerate(self.versions):
                print "%d - Type: %s - Language: %s - Owned: %s" % (i + 1,
                    v.type, v.language, v.owned)

    def add_version(self, type = "Print", lang = "DE", owned = True):
        self.versions.append(Version(self, type, lang, owned))


class Version(object):
    def __init__(self, book, type = "Print", lang = "DE", owned = True):
        self.book = book
        self.type = type
        self.language = lang
        self.owned = owned


class Shelf(object):
    shelfCount = 0

    def __init__(self):
        self.authors = []
        self.books = []

    def add_book(self, author_name, book_title, type = "Print", lang = "DE"):
        # Author known? Else add her.
        for a in self.authors:
            if a.name == author_name:
                break
        else:
            a = Author(author_name)
            self.authors.append(a)

        # Book known? Else add it.
        for b in self.books:
            if b.title == book_title:
                break
        else:
            b = Book(book_title, a)
            self.books.append(b)

        # Add new Version to the book.
        b.add_version(type, lang, True)

    def display(self):
        print "%d books in this shelf." % (len(self.books))
        for b in self.books:
            b.displayBook()

    def displayCount(self):
        print "Total shelves: %d" % Shelf.shelfCount


def test():
    Erdgeschoss = Shelf()
    Erdgeschoss.add_book("Douglas Hofstede", "Goedel, Escher, Bach")
    Erdgeschoss.add_book("Douglas Hofstede", "Goedel, Escher, Bach", "Digital")
    Erdgeschoss.display()

if __name__ == "__main__":
    test()
Test Ausgabe:
1 books in this shelf.
Title: Goedel, Escher, Bach - Author: Douglas Hofstede
2 versions known:
1 - Type: Print - Language: DE - Owned: True
2 - Type: Digital - Language: DE - Owned: True
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
BlackJack

@Kebap: Was ich auf keinen Fall machen würde wäre ein Objektzähler auf Klassenebene. Das funktioniert in der Praxis nicht zuverlässig weil da ja auch Objekte mitgezählt werden die nur temporär erstellt werden, zum Beispiel in Tests.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Sofern du nicht unbedingt selbst etwas erstellen willst, kannst du dir mal Calibre anschauen. Eintraege muss man nicht zwangslaeufig mit ebooks versehen und kann relativ flexibel konfiguriert werden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich finde die Listen in ``Shelf`` auch wenig sinnvoll... wenn man keine Duplikate in einem Container möchte, sollte man das über Sets oder Dictionaries lösen, oder allgemeiner über solche, die dieses effizient ermöglichen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Eine Bedienung per Website-Rumklickerei wäre nett, aber das habe ich erst mal zurückgestellt, bis die Logik soweit funktioniert.
Wenn das das Ziel ist, dann solltest du IMHO das direkt in Django (oder Bottle/Flask/... + SQLAlchemy) umsetzen und die Daten via ORM in eine relationale DB schreiben.

Gruß, noisefloor
Antworten