【问题标题】:__init__ and instance show different values for instance attributes__init__ 和 instance 显示不同的实例属性值
【发布时间】:2015-02-26 21:24:30
【问题描述】:

我正在尝试从 Python 的“请求”库中创建 Response 的子类。当我使用 Python 2.7.6 和 Requests 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__ 看到的内容与实例看到的内容之间存在这种差异?

【问题讨论】:

  • 你正在重新定义self。绝不是一个好主意。
  • @BryanOakley,同意!

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


【解决方案1】:

显然,这两个调用不是针对同一实例的同一属性。这就是为什么他们没有给出相同的输出。这解决了这个问题,方法是创建一个 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)

我怀疑有一个更优雅的解决方案可用(虽然我还没有想出一个),所以我暂时不会将此问题标记为“已回答”。如果有更好的解决方案,请提交!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多