On Fri, 11 Feb 2005, Bob Gailer wrote:
Whenever you find yourself writing an if statement ask whether this would be better handled by subclasses. Whenever you find yourself about to write a global statement, consider making the variables properties of a class.
Bob --
Brian already asked for an explanation of your first statement, and I found the ensuing discussion very instructive.
Can you explain the second? As an aesthetic point, I hate globals, and I'd love a discussion with some examples of using class variables as a way of avoiding this.
Global variables are one way to make state persist across function calls. Here's a toy example that might give you the idea. Suppose you want to write a function that keeps a running total. You could do something like this (not recommended!):
total = 0
def addToTotal(inc): global total total += inc
Every time you call addToTotal, total is incremented.
This is already a poor design.
- There is no encapsulation - to increment the total, you call a function, to view the total you look at the global variable.
- There is no API - to reset the total you would have to set the global variable.
You could try to fix this by adding more functions:
def printTotal(): print 'Total is', total
def resetTotal(): global total total = 0
That's a little better, maybe. But there are other problems: - You can only have one total. What if you want two different totals? - Your global namespace has extra names - total, addToTotal, etc.
For short scripts this structure can work, but for larger projects it gets unwieldy. OOP to the rescue! How about a Total class?
class Total: def __init__(self): self.reset()
def add(self, inc): self.total += inc
def print(self): print 'Total is', self.total
def reset(self): self.total = 0
You can use this like this:
t = Total() t.inc(5) t.print() t.reset()
Now everything is wrapped up in a nice neat package. There is a clear, consistent API, no namespace pollution, and you have a reusable object.
You might also be interested in this essay: http://www.pycs.net/users/0000323/stories/15.html
Kent
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor