Одним из преимуществ property
s является возможность проверки данных - иногда очень важно убедиться, что вы получите что-то очень конкретное.
В вашем случае вам необходимо выполнить одно из следующих действий:две вещи:
- сохраните ваши
teams
данные в структуре, которую нельзя изменить, например, tuple
или namedtuple
;затем, когда данные извлекаются, они не могут быть изменены
или
- Ваш метод
get
вернет копию данных, поэтому любые изменения не могут испортить вашoriginal
Первое решение (неизменяемые типы) выглядит следующим образом:
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)
И когда вы пытаетесь присвоить после получения значения, это происходит:
Traceback (most recent call last):
File "test.py", line 22, in <module>
match1.teams[0]=5
TypeError: 'tuple' object does not support item assignment
Второе решение (возвращение копии вместо оригинала) выглядит следующим образом:
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
, что дает следующие результаты:
['us', u'them']
Как видите, измененияне вернулся в объект match
.