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