11
class attrdict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self.__dict__ = self

a = attrdict(x=1, y=2)
print a.x, a.y

b = attrdict()
b.x, b.y  = 1, 2
print b.x, b.y

誰かが最初の4行を言葉で説明できますか?クラスとメソッドについて読みました。しかし、ここでは非常に混乱しているようです。

4

3 に答える 3

7

行ごとの説明での私のショット:

class attrdict(dict):

この行は、クラスattrdictを組み込みのdictクラスのサブクラスとして宣言します。

def __init__(self, *args, **kwargs): 
    dict.__init__(self, *args, **kwargs)

これが標準的な__init__方法です。の呼び出しdict.__init__(...)は、スーパークラス(この場合はdict)コンストラクター(__init__)メソッドを利用することです。

最後の行はself.__dict__ = self、メソッドに渡すkeyword-arguments(kwargs)が__init__属性のようにアクセスできるようにします。つまり、以下のコードのax、ayです。

これがあなたの混乱を解消するのに役立つことを願っています。

于 2010-04-14T22:33:59.190 に答える
5

例では位置引数を使用していません。したがって、関連するコードは次のとおりです。

class attrdict(dict):
    def __init__(self, **kwargs):
        dict.__init__(self, **kwargs)
        self.__dict__ = self

attrdict最初の行で、クラスをのサブクラスとして定義しますdict。2行目では、インスタンスを自動的に初期化する関数を定義します。**kargsこの関数にキーワード引数()を渡します。インスタンス化するときa

 a = attrdict(x=1, y=2)

あなたは実際に呼んでいます

attrdict.__init__(a, {'x':1, 'y':2})

dictインスタンスコアの初期化は、dict組み込みのスーパークラスを初期化することによって行われます。これは、で受け取ったパラメータを渡す3行目で行われます attrdict.__init__。したがって、

dict.__init__(self,{'x':1, 'y':2})

self(インスタンス)を辞書にしますa

self ==  {'x':1, 'y':2}

最後の行で良いことが起こります。各インスタンスには、その属性を保持する辞書があります。これはself.__dict__(すなわちa.__dict__)です。

たとえば、

a.__dict__ = {'x':1, 'y':2} 

a.xまたはを記述してa.y、それぞれ値1または2を取得できます。

したがって、これは4行目が行うことです。

self.__dict__ = self

と同等です:

a.__dict__ = a  where a = {'x':1, 'y':2}

その後、私は呼び出すことができa.xますa.y

希望はあまり乱雑ではありません。

于 2010-04-14T23:17:43.323 に答える
4

これが説明する良い記事です__dict__

ダイナミックディクト

このattrdictクラスは、ディクショナリから継承し、オブジェクト__dict__をそのディクショナリに設定することで、これを利用します。したがって、属性アクセスは、親ディクショナリ(つまり、dict継承元のクラス)に対して発生します。

この記事の残りの部分は、Pythonオブジェクトを理解するのにも非常に役立ちます。

Pythonの属性とメソッド

于 2010-04-14T22:33:37.020 に答える