<p><code>property</code>s的一个优点是能够进行数据验证有时确保获得非常具体的内容非常重要。在</p>
<p>在您的情况下,您需要做两件事之一:</p>
<ul>
<li>将您的<code>teams</code>数据存储在一个不能修改的结构中,例如<code>tuple</code>或{<cd4>};然后当数据被检索时,它就不能被更改</li>
</ul>
<p>或者</p>
<ul>
<li>让您的<code>get</code>方法返回一个数据的副本,这样任何修改都不会弄乱原始的数据</li>
</ul>
<p>第一个解决方案(不可变类型)如下所示:</p>
<pre><code>class match(object):
__teams=(None,None)
def setTeams(self,tms):
"any sequence type will do, as long as length is two"
if len(tms) != 2:
raise TypeError(
"Teams must be a sequence of length 2"
)
if not isinstance(tms[0], (str, unicode)):
raise TypeError(
"Team names must be str or unicode, not %r" % type(tms[0])
)
if not isinstance(tms[1], (str, unicode)):
raise TypeError(
"Team names must be str or unicode, not %r" % type(tms[0])
)
self.__teams = tuple(tms)
def getTeams(self):
return self.__teams
teams=property(getTeams,setTeams)
</code></pre>
<p>当您在获得值后尝试赋值时,会发生以下情况:</p>
^{pr2}$
<p>第二个解决方案(返回一个副本而不是原来的)如下所示:</p>
<pre><code>class match(object):
__teams=(None,None)
def setTeams(self,tms):
"any sequence type will do, as long as length is two"
if len(tms) != 2:
raise TypeError(
"Teams must be a sequence of length 2"
)
if not isinstance(tms[0], (str, unicode)):
raise TypeError(
"Team names must be str or unicode, not %r" % type(tms[0])
)
if not isinstance(tms[1], (str, unicode)):
raise TypeError(
"Team names must be str or unicode, not %r" % type(tms[0])
)
self.__teams = list(tms)
def getTeams(self):
return list(self.__teams)
teams=property(getTeams,setTeams)
# and the code in action...
match1=match()
match1.teams=('us',u'them')
match1.teams[0]=5
print match1.teams
</code></pre>
<p>其结果如下:</p>
<pre><code>['us', u'them']
</code></pre>
<p>如您所见,更改并没有使其返回到<code>match</code>对象中。在</p>