質問

私はPython学習者であり、現在はさまざまな数のフィールドを持つクラスをハッキングしています。 ここに「名前付きのものの束」の例.

class Bunch:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

また書きたいです __setattr__ このクラスでは、入力属性名を確認します。しかし Pythonドキュメント 言う、

__setattr __()がインスタンス属性に割り当てたい場合、「self.name = value」を単純に実行する必要はありません。これにより、再帰的な呼び出しが発生します。代わりに、インスタンス属性の辞書に値を挿入する必要があります。たとえば、「self .__ dict __ [名前] =値」。インスタンス辞書にアクセスするのではなく、新しいスタイルのクラスの場合、たとえば「オブジェクト.__ setattr __(self、name、value)」など、同じ名前のベースクラスメソッドを呼び出す必要があります。

その場合、私も使用する必要があります object.__dict__ の中に __init__ 交換する機能 self.__dict__?

役に立ちましたか?

解決

いいえ。クラスを次のように定義する必要があります class Bunch(object), 、しかし、継続し続けます self.__dict__.

使用するだけです object.__setattr__ メソッドを定義している間 self.__setattr__ 無限の再帰を防ぐ方法。 __dict__ メソッドではありませんが、オブジェクト自体の属性であるため、 object.__dict__ うまくいきません。

他のヒント

使用できます

class Bunch:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

    def __setattr__(self, name, value):
        #do your verification stuff
        self.__dict__[name] = value

または新しいスタイルのクラスで:

class Bunch(object):
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

    def __setattr__(self, name, value):
        #do your verification stuff
        super(Bunch, self).__setattr__(name, value)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top