Seite 1 von 1

Bücherregal sortieren

Verfasst: Donnerstag 22. Oktober 2015, 14:18
von Kebap
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

Re: Bücherregal sortieren

Verfasst: Donnerstag 22. Oktober 2015, 14:27
von 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.

Re: Bücherregal sortieren

Verfasst: Donnerstag 22. Oktober 2015, 14:31
von cofi
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.

Re: Bücherregal sortieren

Verfasst: Donnerstag 22. Oktober 2015, 15:03
von Hyperion
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.

Re: Bücherregal sortieren

Verfasst: Samstag 24. Oktober 2015, 10:19
von noisefloor
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