<p>首先你用的是老式的课程。你应该使用<a href="http://docs.python.org/glossary.html#term-new-style-class">new style classes that inherit from ^{<cd1>}</a>:</p>
<pre><code>class Swoosh(object):
</code></pre>
<p>定义一个接受参数的<code>__init__</code>方法绝对是python式的做法:</p>
<pre><code>def __init__(self,spam,eggs,swallow,coconut):
self.spam = spam
self.eggs = eggs
self.swallow = swallow
self.coconut = coconut
</code></pre>
<p>这将允许您:</p>
<pre><code>s = Swoosh('Spam!','Eggs','Swallow','Migrated')
</code></pre>
<p>与任何其他Python函数一样,<code>__init__</code>方法可以有参数的默认值,例如</p>
<pre><code>def __init__(self,spam,eggs,swallow,coconut='Migrated.'):
self.spam = spam
self.eggs = eggs
self.swallow = swallow
self.coconut = coconut
</code></pre>
<p>如果希望在设置属性时对其进行验证,则应使用标准<a href="http://docs.python.org/library/functions.html#property">^{<cd4>} attributes</a>,而不是创建自己的setter。如果这样做,您可以在代码中使用<code>myobject.spam</code>,就像使用普通属性一样,但setter方法仍在运行。</p>
<p>例如:</p>
<pre><code>@property
def spam(self):
"""I'm the 'spam' property."""
return self._spam
@spam.setter
def spam(self, value):
if not value.endswith("!"):
raise ValueError("spam must end with !")
# Store the value in "private" _spam attribute
self._spam = value
@spam.deleter
def spam(self):
del self._spam
</code></pre>
<p>注意:<code>property</code>将不工作,除非您使用如上所述的新样式类。</p>
<p>在您的示例中,您有:</p>
<pre><code>class Swoosh():
spam = ''
eggs = ''
swallow = ''
coconut = ''
</code></pre>
<p>这通常是一种快速设置对象属性默认值的方法。很好,但你需要了解实际情况。现在的情况是您正在设置<em>类</em>的属性。如果一个对象没有属性,Python将查看它是否在类上定义并从中返回值(因为这是您想要的方法)。</p>
<p>如果您想为对象属性设置默认值,那么最好像上面描述的那样为<code>__init__</code>中的参数设置默认值,而不是使用<code>class</code>属性。</p>