2

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

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

__setattr__また、入力属性名を確認するために、このクラスにを記述したいと思います。しかし、Pythonのドキュメントには次のように書かれています。

__setattr __()がインスタンス属性に割り当てたい場合は、単に「self.name = value」を実行するべきではありません。これにより、それ自体が再帰的に呼び出されます。代わりに、インスタンス属性のディクショナリに値を挿入する必要があります(例: "self .__ dict __ [name] =value")。新しいスタイルのクラスの場合、インスタンスディクショナリにアクセスするのではなく、同じ名前の基本クラスメソッドを呼び出す必要があります(例: "object .__ setattr __(self、name、value)")。

その場合、置換object.__dict__する関数でも使用する必要がありますか?__init__self.__dict__

4

2 に答える 2

2

使用できます

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)
于 2011-06-10T11:38:06.520 に答える
1

いいえ。クラスをとして定義する必要がありますclass Bunch(object)が、引き続き参照してくださいself.__dict__

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

于 2011-06-10T11:27:09.990 に答える