On Mon, Feb 11, 2013 at 6:58 PM, Steven D'Aprano <st...@pearwood.info>wrote:
> On 11/02/13 16:14, neubyr wrote: > >> I have a text file with each line in following format: >> >> Book Name, Author Name, Genre, Publication Date >> >> I would like to perform following queries on this file: >> * Get all books written by an author >> * Remove all books of an author >> * Get information about a book (pretty print matching line!) >> * Get books of particular genre >> >> Also, I would like to add and delete entries in this file. I am not >> planning to use any database for this purpose and would like to get better >> grasp on file parsing and classes/OOP. I need some help in creating >> classes >> and following are my initial thoughts: >> >> # Create a class for Book object >> class Book: >> atributes: name, author_name, genre, publication-date >> > > > You could use a class. But since Books don't have any behaviour, a simple > struct or record would be better than a class: > > > from collections import namedtuple > Book = namedtuple("Book", "name author genre date") > > lotr = Book("The Hobbit", "J.R.R. Tolkien", "Fantasy", "1937") > > > This has the advantage of simplicity. But if you need to add behaviour to > the > Book class, e.g. validation of the fields, you should be able to inherit > from > a named tuple. Untested: > > > class Book(namedtuple("Book", "name author genre date")): > @property > def genre(self): > return super(Book, self).genre > @genre.setter(self, value): > super(Book, self).genre = value.title() # 'fantasy' -> 'Fantasy' > > > > # Create >> Author: >> attribute(s): name >> > > > As Alan suggested, a waste of time. Since the Author has no behaviour and > only a single field, why not just use a string? > > > > > # Create class for reading and writing to the file >> class Booksfile: >> methods: ?? >> > > Why should this be a class? This is not Java. > > http://steve-yegge.blogspot.**com.au/2006/03/execution-in-** > kingdom-of-nouns.html<http://steve-yegge.blogspot.com.au/2006/03/execution-in-kingdom-of-nouns.html> > > > Just write a function that reads a file and returns a list of Books. > > Or perhaps I should say: > > > Programmer().getwriter().**write(MakeCallable(FileReader)** > .setmethod("read", > return_type=list, return_item_values=Book) > > > > > * How do I associate/relate Book and Author classes so that it will help >> me >> in getting information like 'get list of books written by an author'? Data >> attribute? >> > > You want to map authors to books. Whenever you want a mapping, use a dict: > > > data = { > 'J.R.R. Tolkien': [Book("The Hobbit"), Book("The Lord of the Rings")], > 'Tom Clancy': [Book("The Hunt for Red October")], > 'Terry Pratchett': [Book('Small Gods'), Book('Night Watch'), > Book('Nation')], > 'Stephenie Meyer': [ > Book('Something about abusive boyfriends but that's okay because > they sparkle')], > > } > > > > * Should I create a new Booksfile object for reading, writing and deleting >> entries in the file OR add corresponding methods to the book object >> itself? >> > > Heavens no. Why should the book know about the library catalog it is > listed in? > Your book class should be responsible for the book, and nothing but the > book. > > > > > -- > Steven > > Thanks Steven! I have used namedtuple like approach in few Ruby programs (not the same problem) using Structs, but it didn't strike me for this exercise [1]. I am going to try this approach soon. I haven't added any validation methods for fields yet, but I am planning to add them soon - e.g. validate alphabets or alphanumeric characters etc. It may bring up new questions from my side, but I am sure you all will be glad to help.. :) 1. http://www.ruby-doc.org/core-1.9.3/Struct.html -N
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor