以下代码:
#!/usr/bin/env python
import mechanize
class MechanizeSubclass(mechanize.Browser):
def __init__(self,
factory=None,
history=None,
request_class=None,
):
mechanize.Browser.__init__(self, factory, history, request_class)
def open(self, url, data=None,
timeout=mechanize._sockettimeout._GLOBAL_DEFAULT_TIMEOUT):
mechanize.Browser.open(self, url, data, timeout=timeout)
subclass = MechanizeSubclass()
subclass.open('https://uncjobs.northcarolina.edu/applicants/jsp/shared/Welcome_css.jsp')
print subclass.response().read()
生成错误
mechanize._response.httperror_seek_wrapper: HTTP Error 302: Moved Temporarily
我查看了机械化代码,Browser.open()方法定义为:
def open(self, url, data=None,
timeout=_sockettimeout._GLOBAL_DEFAULT_TIMEOUT):
return self._mech_open(url, data, timeout=timeout)
如果我更改子类中的open()方法以匹配它:
class MechanizeSubclass(mechanize.Browser):
...
def open(self, url, data=None,
timeout=mechanize._sockettimeout._GLOBAL_DEFAULT_TIMEOUT):
return self._mech_open(url, data, timeout=timeout)
然后它工作正常。但我仍然不明白为什么使用mechanize.Browser.open(self,url,data,timeout = timeout)的第一个定义不起作用。它们不应该是等价的吗?这是python 2.6,机械化为0.2.5。
答案 0 :(得分:2)
第一个代码片段和另外两个代码片段之间的主要区别在于open
方法没有返回任何内容(在Python中与返回None
对象相同)。
也就是说,无论调用open
方法的代码是什么,都希望_mech_open
返回该对象。你的第一种方法什么都不返回。
如果您只是将第一个实现更改为:
class MechanizeSubclass(mechanize.Browser):
...
def open(self, url, data=None,
timeout=mechanize._sockettimeout._GLOBAL_DEFAULT_TIMEOUT):
return mechanize.Browser.open(self, url, data, timeout=timeout)
你不应该有这个问题。