Michael Powe wrote:
Clash of the Titans


snip constructor discussions

Pilgrim is pedantically correct but Alan's comment matches how most of us think about it.


---------------- Mundane Matters

I'm having a hard time with classes in python, but it's coming
slowly.  One thing that I think is generally difficult is to parse a
task into "objects."  Here's an example:  in Java, I wrote an
application to track my travelling expenses (I'm a consultant; this
tracking of expenses is the itch I am constantly scratching.  ;-)
I've also written this application in a perl/CGI web application as
well.)  It's easy to see the outline of this task:  create an abstract
class for expense and then extend it for the particular types of
expenses -- travel, food, transportation, lodging and so forth.  In
python, I guess I'd create a class and then "subclass" it.

while that is a valid approach, it is not how most of us would do it. By subclassing you have to edit the code every time a new expense type is added. Ever used MS Money or Quicken? Imagine if the type of each item was a subclass. Use a string.



A similar problem occurs with my HTML-parsing routine that I brought to the list recently. Use of HTMLParser was suggested. I've looked into this and usage means subclassing HTMLParser in order to implement the methods in the way that will accomplish my task. Conceptually, I'm having a hard time with the "object" here. (The fairly poor documentation for HTMLParser doesn't help.) Apparently, I'm creating a "parser" object and feeding it data. At least, that's the closest I can get to understanding this process. How I'm actually feeding data to the "parser" object and retrieving the results are matters open to discussion. I'll be working on that when I get another chance.


This counts the tags in a html file piped in on stdin.

#!/usr/bin/python


import sys, HTMLParser

class TagCounter(HTMLParser.HTMLParser):
    def __init__(self):
        HTMLParser.HTMLParser.__init__(self)
        self.tags = {}

    def handle_starttag(self, tag, attrs):
        self.tags[tag] = self.tags.setdefault(tag, 0) + 1

if __name__ == '__main__':
    counter = TagCounter()
    for line in sys.stdin.xreadlines():
        counter.feed(line)
    counter.close()
    print counter.tags

Finally, in terms of "understanding python," the question I keep
coming up against is:  why do we have both functions and methods?
What is the rationale for making join() a string method and a os.path
function?


a method is a function bound to a class. Nothing super special.

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to