<p><code>class</code>语句是对<code>type</code>的单个调用的包装器。对主体中的语句求值,然后将其添加到传递给<code>type</code>的<code>dict</code>。你知道吗</p>
<p>你的大致相当于</p>
<pre><code>def _init_(self, name):
Person.__init__(self, name)
self.idNum = MITPerson.nextIdNum
MITPerson.nextIDNum += 1
def _getIdNum(self):
return self.idNum
MITPerson = type(
'MITPerson',
(Person,),
{
'__init__': _init,
'getIdNum': _getIdNum,
'nextIdNum': 0
}
)
del _init, _getIdNum
</code></pre>
<p>您可以看到,在创建<code>MITPerson</code>的任何实例之前,<code>nextIdNum</code>立即被初始化为0,就像<code>__init__</code>和<code>getIdNum</code>。你知道吗</p>
<hr/>
<p>创建实例时,将执行以下步骤:</p>
<ol>
<li><code>MITPerson('Mark Guttag')</code>解析为<code>type.__call__(MITPerson, 'Mark Guttag')</code>。你知道吗</li>
<li><code>__call__</code>调用<code>MITPerson.__new__('Mark Guttag')</code>,这将创建<code>MITPerson</code>的新实例。你知道吗</li>
<li>新值被传递给<code>MITPerson.__init__</code>,此时在递增类变量之前使用当前值<code>MITPerson.nextIdNum</code>。你知道吗</li>
<li>一旦<code>__init__</code>返回,<code>__new__</code>返回该值,此时它被赋值给<code>p1</code>。你知道吗</li>
</ol>
<p>请注意,<code>class</code>语句体中的所有代码都不会再次执行,尽管其中定义的函数<code>__init__</code>没有执行。你知道吗</p>