擅长:python、mysql、java
<p>我同意您对文档的一些困惑,因为您的示例中的<code>captain</code>似乎是类属性而不是实例属性</p>
<P>考虑如下:</P>
<pre><code>class BasicStarship:
captain = 'Picard'
def __init__(self, captain=None):
if captain:
self.captain = captain
wtf1 = BasicStarship()
wtf2 = BasicStarship('Me!')
BasicStarship.captain = 'Riker'
print(wtf1.captain)
print(wtf2.captain)
</code></pre>
<p>如您所料(根据您的问题),此打印:</p>
<pre><code>Riker
Me!
</code></pre>
<p>然而,这很有趣:</p>
<pre><code>print(wtf1.__dict__)
print(wtf2.__dict__)
print(BasicStarship.__dict__)
</code></pre>
<p>结果:</p>
<pre><code>{}
{'captain': 'Me!'}
{'__module__': '__main__', 'captain': 'Riker', '__init__': <etc.> }
</code></pre>
<p>因此,<code>wtf1</code>没有一个名为<code>captain</code>的属性,因此使用名为<code>captain</code>的类属性(解释了当您更改它时为什么会更改)<code>wtf2</code>确实有一个名为<code>captain</code>的属性,因此它会覆盖class属性<code>BasicStarship</code>显示class属性</p>
<p>这一切都是有意义的,并且与实际文档中给出的示例类似,唯一令人困惑的部分是描述为<code>instance variable with default</code>,因为它似乎更正确,为<code>class variable with default</code></p>
<p>(在Python 3.7.5上,其他方面相同)</p>