<p>基本验证可以通过重写适当的<a href="http://docs.python.org/reference/datamodel.html#customizing-attribute-access" rel="nofollow">get and set methods on the class</a>(如果在所有情况下都需要进行验证)或使用内置的<a href="http://docs.python.org/library/functions.html#property" rel="nofollow">^{<cd1>}</a>更改特定属性来完成。记住,<a href="http://dirtsimple.org/2004/12/python-is-not-java.html" rel="nofollow">Python is not Java</a>(当然,<a href="http://dirtsimple.org/2004/12/java-is-not-python-either.html" rel="nofollow">Java is not Python, either</a>)。</p>
<p>至于如何创建类,您有两个选择:</p>
<p>1)使用带关键字参数的<code>__init__</code>方法,让人们向您的构造函数提供尽可能多或少的内容:</p>
<pre><code>class Swoosh(object): # Get new-object goodness
def __init__(self, spam='', eggs='', swallow='', coconut=''):
# We are going to be using properties in this example
self._spam = spam
self._eggs = eggs
self._swallow = swallow
self._coconut = coconut
</code></pre>
<p>2)继续按原样做,但将类属性更新为实例属性:</p>
<pre><code>class Swoosh(object): # Get new-object goodness
def __init__(self):
self.spam = ''
self.eggs = ''
self.swallow = ''
self.coconut = ''
</code></pre>
<p>按照您目前的做法,<code>Swoosh</code>的每个实例都为这些变量共享相同的值,并且更改<code>Swoosh</code>上的<code>spam</code>的值将更改<code>Swoosh</code>的每个实例的<code>Swoosh</code>的值,这些实例没有设置具有相同名称</em>的实例属性(这可能不是您想要的)</p>
<p>不管怎样,您都应该考虑删除getter和setter并用属性替换它们(何时这样做当然取决于这个API的公开性和广泛使用程度):</p>
<pre><code># Inside class Swoosh's definition
@property
def spam(self):
return self._spam
@spam.setter
def spam(self, value):
# Validate that it's really SPAM, not WHAM!
# And only then replace the underlying value
self._spam = value
@spam.deleter
def spam(self):
del self._spam
# Rinse and repeat for other properties that need access control
</code></pre>