擅长:python、mysql、java
<p>当遇到类定义时,Python会毫不犹豫地执行主体。你知道吗</p>
<p>首先,它将执行<code>class one</code>,在执行主体时(在实际创建类之前),它将遇到<code>class two</code>,因此它将执行该操作。你知道吗</p>
<p>在<code>class two</code>内,它将看到对<code>one</code>的引用,但该引用仍然不存在,因此将引发<code>NameError</code>。你知道吗</p>
<p>查看Python处理类/函数的方式差异的一个简单方法是将第二个类定义包装到函数中。由于Python只编译</em>函数而不执行它们,<code>class one</code>将被创建:</p>
<pre><code>class one:
x = 1
def wrap():
class two:
y = one.x
one.two = two
</code></pre>
<p>现在<code>one</code>作为一个类存在。如果您执行<code>one.wrap</code>第二个类定义将被执行,那么<code>one</code>类将被找到,然后,按照您原来的示例执行;我将类<code>two</code>设置为<code>one</code>的属性,以获得与您所期望的效果相同的效果。你知道吗</p>
<p>因此,名称解析工作正常,类<code>two</code>现在具有类<code>one</code>属性:</p>
<pre><code>one.wrap()
one.two.y
Out[22]: 1
</code></pre>
<hr/>
<p><strong>注意:</strong>将第二个类移到第一个类定义之外也是可行的,但这不是重点。你知道吗</p>