例では位置引数を使用していません。したがって、関連するコードは次のとおりです。
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
。
希望はあまり乱雑ではありません。