<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>程序员在使用静态类变量时必须考虑的一件事是,它们可以被实例变量隐藏(如果您通过<code>self</code>引用访问静态类变量)。</p>
<p><strong>说明</strong>:</p>
<p>以前,我认为声明变量的两种方法完全相同(我真傻),部分原因是我可以通过<code>self</code>引用访问这两种变量。现在,当我遇到麻烦时,我研究了这个话题并把它弄清楚了。</p>
<p>通过
<code>self</code>引用是指如果没有同名的实例变量</em>,它只引用静态类变量</em>,并且使事情变得更糟,试图通过<code>self</code>引用重新定义静态类变量</em>不起作用,因为创建了一个<em>实例变量</em>,该变量将隐藏以前可访问的静态类变量</em>。</p>
<p>为了解决这个问题,您应该始终通过类的名称引用静态类变量。</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>