<p>我想在我在这个线程和<a href="https://stackoverflow.com/questions/9056957/correct-way-to-define-class-variables-in-python">this thread</a>(它引用了这个)中读到的响应中添加一些东西</p>
<p><strong>免责声明</strong>:这句话来自于我进行的实验</p>
<p><strong>变量在<code>__init__</code></strong>之外:</p>
<p>事实上,这些变量是静态类变量,因此可以访问类的所有实例</p>
<p><strong>变量在<code>__init__</code></strong>中:</p>
<p>这些<em>实例变量</em>的值只能由手头的实例访问(通过<code>self</code>引用)</p>
<p><strong>我的贡献</strong>:</p>
<> P>>程序员在使用<EM>静态类变量<EEM时必须考虑的一点是,它们可以被<EM >实例变量<eEM>所遮蔽(如果您通过^ {CD3>}引用访问<EM>静态类变量<EEM >)p>
<p><strong>说明</strong>:</p>
<p>在此之前,我认为声明变量的两种方式完全相同(愚蠢的我),这部分是因为我可以通过<code>self</code>引用访问这两种变量。现在,当我遇到麻烦时,我研究了这个话题并澄清了它</p>
<p>通过
<code>self</code>引用是指如果没有同名的<em>实例变量</em>,它只引用<em>静态类变量</em>,更糟糕的是,它试图通过<code>self</code>重新定义<em>静态类变量</em>引用不起作用,因为创建了一个<em>实例变量</em>,该实例变量会隐藏以前可访问的<em>静态类变量</em></p>
<p>为了解决这个问题,您应该始终通过类的名称引用<em>静态类变量</em></p>
<p><strong>示例</strong>:</p>
<pre><code>#!/usr/bin/env python
class Foo:
static_var = 'every instance has access'
def __init__(self,name):
self.instance_var = 'I am %s' % name
def printAll(self):
print 'self.instance_var = %s' % self.instance_var
print 'self.static_var = %s' % self.static_var
print 'Foo.static_var = %s' % Foo.static_var
f1 = Foo('f1')
f1.printAll()
f1.static_var = 'Shadowing static_var'
f1.printAll()
f2 = Foo('f2')
f2.printAll()
Foo.static_var = 'modified class'
f1.printAll()
f2.printAll()
</code></pre>
<p><strong>输出</strong>:</p>
<pre><code>self.instance_var = I am f1
self.static_var = every instance has access
Foo.static_var = every instance has access
self.instance_var = I am f1
self.static_var = Shadowing static_var
Foo.static_var = every instance has access
self.instance_var = I am f2
self.static_var = every instance has access
Foo.static_var = every instance has access
self.instance_var = I am f1
self.static_var = Shadowing static_var
Foo.static_var = modified class
self.instance_var = I am f2
self.static_var = modified class
Foo.static_var = modified class
</code></pre>
<p>我希望这对某人有帮助</p>