<br><br><div class="gmail_quote">On Mon, Feb 11, 2013 at 6:58 PM, Steven D'Aprano <span dir="ltr"><<a href="mailto:steve@pearwood.info" target="_blank">steve@pearwood.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On 11/02/13 16:14, neubyr wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I have a text file with each line in following format:<br>
<br>
Book Name, Author Name, Genre, Publication Date<br>
<br>
I would like to perform following queries on this file:<br>
  * Get all books written by an author<br>
  * Remove all books of an author<br>
  * Get information about a book (pretty print matching line!)<br>
  * Get books of particular genre<br>
<br>
Also, I would like to add and delete entries in this file. I am not<br>
planning to use any database for this purpose and would like to get better<br>
grasp on file parsing and classes/OOP. I need some help in creating classes<br>
and following are my initial thoughts:<br>
<br>
# Create a class for Book object<br>
class Book:<br>
   atributes: name, author_name, genre, publication-date<br>
</blockquote>
<br>
<br></div>
You could use a class. But since Books don't have any behaviour, a simple<br>
struct or record would be better than a class:<br>
<br>
<br>
from collections import namedtuple<br>
Book = namedtuple("Book", "name author genre date")<br>
<br>
lotr = Book("The Hobbit", "J.R.R. Tolkien", "Fantasy", "1937")<br>
<br>
<br>
This has the advantage of simplicity. But if you need to add behaviour to the<br>
Book class, e.g. validation of the fields, you should be able to inherit from<br>
a named tuple. Untested:<br>
<br>
<br>
class Book(namedtuple("Book", "name author genre date")):<br>
    @property<br>
    def genre(self):<br>
        return super(Book, self).genre<br>
    @genre.setter(self, value):<br>
        super(Book, self).genre = value.title()  # 'fantasy' -> 'Fantasy'<div class="im"><br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
# Create<br>
Author:<br>
  attribute(s): name<br>
</blockquote>
<br>
<br></div>
As Alan suggested, a waste of time. Since the Author has no behaviour and<br>
only a single field, why not just use a string?<div class="im"><br>
<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
# Create class for reading and writing to the file<br>
class Booksfile:<br>
   methods: ??<br>
</blockquote>
<br></div>
Why should this be a class? This is not Java.<br>
<br>
<a href="http://steve-yegge.blogspot.com.au/2006/03/execution-in-kingdom-of-nouns.html" target="_blank">http://steve-yegge.blogspot.<u></u>com.au/2006/03/execution-in-<u></u>kingdom-of-nouns.html</a><br>
<br>
<br>
Just write a function that reads a file and returns a list of Books.<br>
<br>
Or perhaps I should say:<br>
<br>
<br>
Programmer().getwriter().<u></u>write(MakeCallable(FileReader)<u></u>.setmethod("read",<br>
    return_type=list, return_item_values=Book)<div class="im"><br>
<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
* How do I associate/relate Book and Author classes so that it will help me<br>
in getting information like 'get list of books written by an author'? Data<br>
attribute?<br>
</blockquote>
<br></div>
You want to map authors to books. Whenever you want a mapping, use a dict:<br>
<br>
<br>
data = {<br>
    'J.R.R. Tolkien': [Book("The Hobbit"), Book("The Lord of the Rings")],<br>
    'Tom Clancy': [Book("The Hunt for Red October")],<br>
    'Terry Pratchett': [Book('Small Gods'), Book('Night Watch'),<br>
        Book('Nation')],<br>
    'Stephenie Meyer': [<br>
        Book('Something about abusive boyfriends but that's okay because they sparkle')],<div class="im"><br>
    }<br>
<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
* Should I create a new Booksfile object for reading, writing and deleting<br>
entries in the file OR add corresponding methods to the book object itself?<br>
</blockquote>
<br></div>
Heavens no. Why should the book know about the library catalog it is listed in?<br>
Your book class should be responsible for the book, and nothing but the book.<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
<br>
<br>
-- <br>
Steven</font></span><div class="HOEnZb"><div class="h5"><br>
</div></div></blockquote></div><br><div><br></div><div>Thanks Steven!</div><div><br></div><div>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.</div>
<div><br></div><div>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.. :)</div>
<div><br></div><div>1. <a href="http://www.ruby-doc.org/core-1.9.3/Struct.html">http://www.ruby-doc.org/core-1.9.3/Struct.html</a></div><div><br></div><div>-N</div><div><br></div>