【问题标题】:method __getattr__ is not inherited from parent class方法 __getattr__ 不是从父类继承的
【发布时间】:2011-06-20 18:02:43
【问题描述】:

尝试继承mechanize.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)

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

【问题讨论】:

    标签: python class inheritance methods getattr


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      您需要覆盖__setattr__ 以支持这种方式的assignment__getattr__ 仅供检索

      【讨论】:

      • 浏览器类没有__setattr__ 方法。
      • 没关系,您可以根据需要创建自己的。但这可能是您可能不想这样做的一个线索,因为他们可能只有一个而没有另一个。
      • 如果我想要与父类相同的行为怎么办?我只是写:br = Browser(); ...; br["some_input_name"] = "Blah.."; 它对我来说很好用。
      • Pardon.. 正如 Rosh Oxymoron 所说,我的目标方法被命名为 __getitem____setitem__
      【解决方案3】:

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

      【讨论】:

      • 哦,对不起..我知道但忘记了。这些方法会继承到我的类吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 2020-04-29
      • 2017-07-20
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      相关资源
      最近更新 更多