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

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)

クラスまたはインスタンスが親クラスのようにこのメソッドを取得しないのはなぜですか?

4

3 に答える 3

1

この方法で割り当て__setattr__をサポートするには、オーバーライドする必要があります。 は検索専用です__getattr__

于 2011-02-03T15:19:22.767 に答える
1

アイテムと属性の違いです。項目には を使用してアクセスしob[item]、属性には を使用してアクセスしob.itemます。アイテムの割り当てを定義するメソッドは__getitem____setitem__で、アイテムにアクセスするだけでなく、アイテムを設定する場合は 2 番目のメソッドが必要です。メソッド__getattr____setattr__および__getattribute__は属性を処理しますが、ここでは役に立ちません。また、最後の 2 つは、クラスの作成が複雑になりすぎるため、避ける必要があります。

于 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 に答える