2012-02-26 4 views
1

次のコードオーバーライドパイソンMechanize.Browser.open()メソッド

#!/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のコードを見て、Browser.open()メソッドが定義されている

mechanize._response.httperror_seek_wrapper: HTTP Error 302: Moved Temporarily 

エラーを生成よう:

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)を使った最初の定義がうまくいかない理由はまだ分かりません。彼らは同等ではありませんか?これは、機械翻訳0.2.5のPython 2.6です。

答えて

2

最初のコードスニペットと他の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) 

あなたは、この問題を持つべきではありません。

+0

それはそれだった - それは今働いている。 –

関連する問題