为什么我无法使用用户名和密码初始化自定义FancyURLopener

0 投票
2 回答
1182 浏览
提问于 2025-04-16 17:51

我在写一个自定义的 urllib.FancyURLopener 时遇到问题,想在构造函数里初始化用户名和密码。用一个空的构造函数和后面调用 setpasswd 的方法可以正常工作。但是当我尝试在构造函数里直接设置用户名和密码时,出现了奇怪的错误,提示缺少一个叫 'tempcache' 的属性。我是不是在 Python 的 init 方面漏掉了什么语法或用法?

我想像这样在构造函数里指定我的用户名和密码:

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

用这种方式尝试失败了:

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")

输出结果:

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

我也试过:

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")

但这产生了:

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

我唯一能让它工作的方式是:

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")

但这样我就得在单独的一行里指定我的用户名和密码。我知道这其实没什么大不了的,但正如我上面所说的,我真的想知道在 Python 的继承和 init 等方面我是不是漏掉了什么。

2 个回答

0

确保你调用了父类的 __init__ 方法,像这样:

class MyRouterOpener(urllib.FancyURLopener):
    def __init__(self, user, passwd):
        # grr, old-style classes. :(
        urllib.FancyURLopener.__init__(self)

        # fancy custom fun stuff!
        self.__user = user
        self.__passwd = passwd
5

你可能需要调用父对象的init方法,这个方法会设置tempcache属性。

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

(在调用时要使用正确的参数来创建urllib.FancyURLopener)

撰写回答