On 11/02/13 22:49, neubyr wrote:

is right approach to implement 'list_by_author' function as a class
method is typically used as an alternative constructor.

Not at all that is only one use case for class methods.
A class method is *any* method that operates on the whole class of objects - i.e. all instances(potentially including those still to be created)

Now I agree that in some lanmguages they tend to be limited to factory metjods(eg Objective C implicitly goes that way) but in others like Smalltalk search methods and persistence etc are often found as class methods. In Python, because of it's hybrid nature, these are often "demoted" to global scope functions.


Here I am
returning list of objects and not just an object.

Which is to say a subset of the class Book.
Therefore quite reasonably a class method.

   @classmethod
   def list_by_author(self,author):
     """ Return list of books of an author """
     bookfile = config.bookfile
     books = [] # empty list - used as list of Books
     # TODO: improve regex
     regex = re.compile(author)
     with open (bookfile,'r') as f:
       for line in f:
         if regex.findall(line):
           # error prone - if name contains comma
           l = line.split(',')
           # create book object and append it to a list
           book = self(*l)
           books.append(book)
     return books # return list of books

I'd probably, for a small dataset, load a list of books into the class at startup and save it at termination. Which makes the search code easier and potentially can be data driven so you pass the filter attribute as a parameter. You can then use getattr() to find the value:

def findBooks(cls, param, value):
    return [book for book in books if getattr(book, param) == value]

You could make it more flexible still by defining the filter as a function and passing a lambda:

def findBooks(cls, filterExp):
    return [book for book in books if filterExp(book)]


Usage example:

DickensBooks = Book.findBook(lambda b: 'Dickens' in b.author)


Of course if you have a huge dataset then that won't work - which brings us back to a database :-)

HTH

--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to