创建Python类方法

nut*_*hip 4 python class class-method

我已经熟悉了这个概念,最值得注意的是观看了Raymond Hettinger的精彩视频并阅读了这里接受的答案,我想知道我的错误.

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)
Run Code Online (Sandbox Code Playgroud)

这有效

r = ReadHTML('http://example.com')
print r.page
Run Code Online (Sandbox Code Playgroud)

而事实并非如此

r = ReadHTML.from_file('example.html')
print r.page 
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误,好像我试图"urlopen"文件:

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>
Run Code Online (Sandbox Code Playgroud)

你能看出什么是错的吗?

Mar*_*ers 5

ReadHTML.__init__()当你打电话时,你仍在呼叫班级初始化者cls(page); 该呼叫与呼叫没有什么不同ReadHTML(page),您只是使用不同的引用.此方法仅接受url参数,代码将其传递给该参数urlopen().

调整您的ReadHTML.__init__()方法以处理传递页面而不是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)
Run Code Online (Sandbox Code Playgroud)

现在代码支持生成实例的两个路径.