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