__init__和instance显示实例属性的不同值

时间:2015-02-26 21:24:31

标签: python python-2.7 web-scraping python-requests

我正在尝试从"请求"创建Response的子类。 Python库。当我使用Python 2.7.6和请求2.5.3执行以下操作时:

import requests

class Page(requests.Response):
    # A Page is a Response that reported itself to be OK (HTTP "200").

    def __init__(self, url):
        requests.Response.__init__(self)
        self = requests.get(url)
        assert self.status_code is 200
        print "Status code according to __init__: " + str(self.status_code)

p = Page("http://www.google.com/")
print "Status code according to instance: " + str(p.status_code)

我得到了这个输出:

Status code according to __init__: 200
Status code according to instance: None

这对我来说很惊讶。我认为这两个调用正在处理同一个实例的相同属性,因此期望它们提供相同的输出。

实际上,所有实例的属性都表明在从__init__调用时(即不只是self.status_code而且还有self.text等)会填充它们。但是,如果我从实例中调用相同的属性(例如p.text),它们会产生None或类似的属性,就好像它们尚未初始化一样。

为什么__init__看到的内容与实例看到的内容之间存在差异?

1 个答案:

答案 0 :(得分:0)

显然,这两个电话是,用于解决同一个实例的相同属性。这就是他们没有给出相同输出的原因。这解决了这个问题,方法是创建一个Request对象,然后将其属性复制到Page对象:

import requests

class Page(requests.Response):
    # A Page is a Response that has been retrieved and found OK (HTTP "200").

    def __init__(self, url):
        requests.Response.__init__(self)
        r = requests.get(url)
        self.__dict__.update(r.__dict__)
        assert self.status_code is 200
        print "Status code according to __init__: " + str(self.status_code)

p = Page("http://www.google.com/")
print "Status code according to object: " + str(p.status_code)

我怀疑有一个更优雅的解决方案可用(虽然我尚未提出一个),所以我现在不会将这个问题标记为“已回答”。如果您有解决方案,请提交更好的解决方案!