我正在尝试从"请求"创建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__
看到的内容与实例看到的内容之间存在差异?
答案 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)
我怀疑有一个更优雅的解决方案可用(虽然我尚未提出一个),所以我现在不会将这个问题标记为“已回答”。如果您有解决方案,请提交更好的解决方案!