[Tutor] Communication between classes

Andrei project5 at redrival.net
Mon Apr 2 09:30:04 CEST 2007


Greg Perry <gregp <at> liveammo.com> writes:

> Is it safe to say that classes are only useful for instances where reuse is a
key consideration?  From my very
> limited perspective, it seems that classes are in most cases overkill for
simple tasks (such as reading
> the command line then calculating a hash/checksum to verify integrity).

Alan has already adressed your questions, I just have one addition on this
point. If this is *all* your application does, a class is indeed overkill.
However, if this functionality is part of a larger application, it could become
a small class. 

Imagine an application that would offer some file operations, like:
- calculate hash
- split into chunks of 1.44 MB
- compress
- encrypt

You could have a generic ancestor class, say FileOperation and inherit from it
different classes implementing specific operations.

  class FileOperation(object):
      def __init__(self, filename):
          self._filename = filename
      def Perform(self):
          pass # should be implemented in children
      def ShowHelp(self):
          pass # should be implemented in children

  class HashFileOperation(FileOperation):
      def Perform(self):
          # calculate hash of self._filename
      def ShowHelp(self):
          print "Calculates MD5 hash of the file"

  <etc>

Depending on a command line option, the application could instantiate one of the
operation classes and work with it. Assuming the command line would be 'app.py
<operation> <filename>' (e.g. 'app.py hash myfile.txt'), the application code
could look something like this:

  # register all known operation classes and bind them
  # to specific command line options
  operations = {'hash': HashFileOperation,
                'split': SplitFileOperation, <etc>}

  opname = sys.argv[1]

  # determine what operation class is necessary
  opclass = operations[opname]

  # instantiate that operation (make a file operation object)
  fileop = opclass(sys.argv[2])

  # check if it should display help or run the operation
  if sys.argv[2] == '?': 
      fileop.ShowHelp()
  else:    
      fileop.Perform()

Adding new operations would be a matter of implementing an appropriate class and
adding it to the operations dictionary. With a bit of Python magic you could
even get the operation classes to auto-register, so just writing an operation
class would automatically make it available in the application.

-- 
Yours,

Andrei

=====
Mail address in header catches spam. Real contact info:
''.join([''.join(s) for s in zip(
"poet <at> aao.l pmfe!Pes ontuei ulcpss  edtels,s hr' one oC.",
"rjc5wndon.Sa-re laed o s npbi ot.Ira h it oteesn edt C")])




More information about the Tutor mailing list