1

试图继承机械化.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)

为什么我的类或实例没有像在父类中那样获得此方法?

4

3 回答 3

1

您需要覆盖__setattr__以支持这种方式的分配__getattr__仅用于检索

于 2011-02-03T15:19:22.767 回答
1

物品和属性是有区别的。使用 访问项目,使用 访问ob[item]属性ob.item。定义项目分配的方法是__getitem____setitem__,如果要设置项目,则需要第二个方法,而不仅仅是访问它们。方法__getattr__和处理属性__setattr____getattribute__在这里对您没有帮助,此外,应该避免使用最后两个,因为它们会使您的类的创建过于复杂。

于 2011-02-03T15:23:39.560 回答
1

不要从对象继承,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)
于 2011-05-12T19:31:02.927 回答