Search code examples
pythonclassclass-method

Creating a Python classmethod


I've familiarized myself with the concept, most notably by watching Raymond Hettinger's excellent video and reading the accepted answer here and I am wondering what I got wrong.

class ReadHTML(object):

    def __init__(self, url):
        page = urlopen(url).read()
        self.page = page

    @classmethod
    def from_file(cls, path):
        page = open(path).read()
        return cls(page)

This works

r = ReadHTML('http://example.com')
print r.page

and this is not

r = ReadHTML.from_file('example.html')
print r.page 

it throws me an error, as if I was trying to "urlopen" a file:

File "/usr/lib/python2.7/urllib2.py", line 258, in get_type
    raise ValueError, "unknown url type: %s" % self.__original
ValueError: unknown url type: <!doctype html>

Can you see what's wrong?


Solution

  • You are still calling the class initializer, ReadHTML.__init__(), when you call cls(page); that call is no different from calling ReadHTML(page), you are just using a different reference. This method only accepts a url parameter and the code passes that to urlopen() regardless.

    Adjust your ReadHTML.__init__() method to handle being passed a page instead of a URL:

    class ReadHTML(object):
        def __init__(self, url=None, page=None):
            if url is not None:
                page = urlopen(url).read()
            self.page = page
    
        @classmethod
        def from_file(cls, path):
            page = open(path).read()
            return cls(page=page)
    

    Now the code supports both paths to produce an instance.