Метод __getattr__ не наследуется от родительского класса - PullRequest
0 голосов
/ 03 февраля 2011

Попытка создать подкласс механизировать . Класс браузера:

from mechanize import Browser

class LLManager(Browser, object):
    IS_AUTHORIZED = False
    def __init__(self, login = "", passw = "", *args, **kwargs):
        super(LLManager, self).__init__(*args, **kwargs)
        self.set_handle_robots(False)

Но когда я делаю что-то вроде этого:

lm["Widget[LinksList]_link_1_title"] = anc

, тогда я получаю ошибку:

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    lm["Widget[LinksList]_link_1_title"] = anc
TypeError: 'LLManager' object does not support item assignment

У класса браузера есть переопределенный метод __getattr__, как показано:

def __getattr__(self, name):
    # pass through _form.HTMLForm methods and attributes
    form = self.__dict__.get("form")
    if form is None:
        raise AttributeError(
            "%s instance has no attribute %s (perhaps you forgot to "
            ".select_form()?)" % (self.__class__, name))
    return getattr(form, name)

Почему мой класс или экземпляр не получают этот метод как в родительском классе?

Ответы [ 3 ]

1 голос
/ 03 февраля 2011

Есть разница между предметами и атрибутами. Доступ к элементам осуществляется с помощью ob[item], а к атрибутам - с использованием ob.item. Методы, которые определяют назначение элемента, это __getitem__ и __setitem__, и второй требуется, если вы собираетесь устанавливать элементы, а не только получать к ним доступ. Методы __getattr__, __setattr__ и __getattribute__ имеют дело с атрибутами и здесь вам не помогут, кроме того, следует избегать двух последних, поскольку они слишком усложняют создание вашего класса.

1 голос
/ 12 мая 2011

Не наследуйте от объекта, mechanize.Browser не использует новые классы стилей. Это должно работать как ожидалось.

from mechanize import Browser

class LLManager(Browser):
    IS_AUTHORIZED = False
    def __init__(self, login = "", passw = "", *args, **kwargs):
        mechanize.Browser.__init__(self, *args, **kwargs)
        self.set_handle_robots(False)
1 голос
/ 03 февраля 2011

Вам необходимо переопределить __setattr__ для поддержки назначения таким способом.__getattr__ только для поиска

...