方法\u getattr\uu不是从父类继承的

2024-09-30 16:33:52 发布

您现在位置:Python中文网/ 问答频道 /正文

正在尝试子类mechanize。浏览器类:

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)

但当我做这样的事情时:

^{pr2}$

然后我得到一个错误:

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

Browser类已重写方法__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)

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


Tags: 方法nameselfbrowserformfalseobjectinit
3条回答

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

不从对象继承,机械化.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__仅用于检索

相关问题 更多 >