почему я не могу __init__ мой пользовательский FancyURLopener с пользователем & passwd - PullRequest
0 голосов
/ 18 мая 2011

Я не могу написать пользовательский urllib.FancyURLopener, который инициализирует значения user и passwd в конструкторе. Я могу заставить его работать нормально с пустым конструктором и последующим вызовом 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 ]

5 голосов
/ 18 мая 2011

Вы, вероятно, должны вызвать родительский объект init , который устанавливает атрибут tempcache.

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

(Назовите его с правильными аргументами для создателя urllib.FancyURLopener)

0 голосов
/ 18 мая 2011

Убедитесь, что вы вызываете метод __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
...