为什么我不能__init__我的自定义FancyURLopener与用户&passwd

Tim*_*son 0 python urllib

我无法编写自定义urllib.FancyURLopener,它在构造函数中初始化用户和passwd值.我可以使用空构造函数和后续调用setpasswd来使其正常工作.当我尝试在构造函数中设置用户和密码时,我会发现有关缺少属性"tempcache"的奇怪错误.我是否遗漏了一些关于init的 Python语法/用法?

我希望能够在构造函数中指定我的用户和passwd,如下所示:

opener = MyRouterOpener("", "secretPassword")
page = opener.open("http://192.168.1.1/Status_Router.asp")
#do something with the page
Run Code Online (Sandbox Code Playgroud)

尝试这种方式失败:

import urllib

class MyRouterOpener(urllib.FancyURLopener):
    def __init__(self, user, passwd):
        self.setpasswd(user, passwd)

    def setpasswd(self, user, passwd):
        self.__user = user
        self.__passwd = passwd

    def prompt_user_passwd(self, host, realm):
        return self.__user, self.__passwd

opener = MyRouterOpener("", "secretPassword")
statusPage = opener.open("http://192.168.1.1/Status_Router.asp")
Run Code Online (Sandbox Code Playgroud)

输出:

Traceback (most recent call last):
  File "W:\Desktop\DynDns.enom.bad.py", line 15, in <module>
    statusPage = opener.open("http://192.168.1.1/Status_Router.asp")
  File "C:\Users\pengt\Python26\lib\urllib.py", line 179, in open
    if self.tempcache and fullurl in self.tempcache:
AttributeError: RouterOpener instance has no attribute 'tempcache'
Exception AttributeError: "RouterOpener instance has no attribute 'tempcache'" in <bound method RouterOpener.__del__ of <__main__.RouterOpener instance at 0x022AB9E0>> ignored
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

import urllib

class RouterOpener(urllib.FancyURLopener):
def __init__(self, user, passwd):
    self.__user = user
    self.__passwd = passwd

def prompt_user_passwd(self, host, realm):
    return self.__user, self.__passwd

opener = RouterOpener("", "secretPassword")
statusPage = opener.open("http://192.168.1.1/Status_Router.asp")
Run Code Online (Sandbox Code Playgroud)

但这会产生:

Traceback (most recent call last):
  File "W:\Desktop\DynDns.enom.bad.py", line 12, in <module>
    statusPage = opener.open("http://192.168.1.1/Status_Router.asp")
  File "C:\Users\pengt\Python26\lib\urllib.py", line 179, in open
    if self.tempcache and fullurl in self.tempcache:
AttributeError: RouterOpener instance has no attribute 'tempcache'
Exception AttributeError: "RouterOpener instance has no attribute 'tempcache'" in <bound method RouterOpener.__del__ of <__main__.RouterOpener instance at 0x0231B968>> ignored
Run Code Online (Sandbox Code Playgroud)

我唯一能够得到的工作是:

import urllib

class MyRouterOpener(urllib.FancyURLopener):
    def setpasswd(self, user, passwd):
        self.__user = user
        self.__passwd = passwd

    def prompt_user_passwd(self, host, realm):
        return self.__user, self.__passwd

opener = MyRouterOpener()
opener.setpasswd("", "secretPassword")
statusPage = opener.open("http://192.168.1.1/Status_Router.asp")
Run Code Online (Sandbox Code Playgroud)

但后来我在一个单独的行上指定了我的用户和passwd.我知道这真的没什么大不了的,但就像我上面说的那样,我真的很想知道我是否遗漏了关于继承和init等方面的Python .

Ale*_*lev 5

您可能必须调用父对象的init来设置tempcache属性.

def __init__(self, user, passwd):
    self.__user = user
    self.__passwd = passwd
    urllib.FancyURLopener.__init__(self)
Run Code Online (Sandbox Code Playgroud)

(使用urllib.FancyURLopener创建者的正确参数调用它)