Метод __getattr__ не наследуется от родительского класса
Попытка подкласса механизировать.Browser класс:
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 ответа
Не наследуйте от объекта, 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)
Вы должны переопределить __setattr__
поддержать назначение таким способом. __getattr__
только для поиска
Есть разница между предметами и атрибутами. Доступ к элементам осуществляется с помощью ob[item]
в то время как атрибуты доступны с помощью ob.item
, Методы, которые определяют назначение элемента: __getitem__
а также __setitem__
, а второй требуется, если вы собираетесь устанавливать элементы, а не только получать к ним доступ. Методы __getattr__
, __setattr__
а также __getattribute__
иметь дело с атрибутами, и здесь вам не помочь, кроме того, следует избегать двух последних, потому что они слишком усложняют создание вашего класса.