<p>您的示例中没有使用位置参数。所以相关代码是:</p>
<pre><code>class attrdict(dict):
def __init__(self, **kwargs):
dict.__init__(self, **kwargs)
self.__dict__ = self
</code></pre>
<p>在第一行中,您将类<code>attrdict</code>定义为<code>dict</code>的子类。
在第二行中,定义自动初始化实例的函数。将关键字参数(<code>**kargs</code>)传递给此函数。当您实例化<code>a</code>时:</p>
<pre><code> a = attrdict(x=1, y=2)
</code></pre>
<p>你真的在打电话</p>
<pre><code>attrdict.__init__(a, {'x':1, 'y':2})
</code></pre>
<p>dict实例核心初始化是通过初始化<code>dict</code>内置超类来完成的。这是在传递在<code>attrdict.__init__</code>中接收到的参数的第三行中完成的。
因此</p>
<pre><code>dict.__init__(self,{'x':1, 'y':2})
</code></pre>
<p>使<code>self</code>(实例<code>a</code>)成为字典:</p>
<pre><code>self == {'x':1, 'y':2}
</code></pre>
<p>好事情发生在最后一行:
每个实例都有一个保存其属性的字典。这是<code>self.__dict__</code>(即<code>a.__dict__</code>)。</p>
<p>例如,如果</p>
<pre><code>a.__dict__ = {'x':1, 'y':2}
</code></pre>
<p>我们可以分别写<code>a.x</code>或<code>a.y</code>并得到值1或2。</p>
<p>所以,这就是第4行的作用:</p>
<pre><code>self.__dict__ = self
</code></pre>
<p>相当于:</p>
<pre><code>a.__dict__ = a where a = {'x':1, 'y':2}
</code></pre>
<p>然后我可以调用<code>a.x</code>和<code>a.y</code>。</p>
<p>希望不是太乱。</p>