tst*_*tst 4 python properties class
我是python的新手,我想要一些帮助.我创建了一些带有属性的类,以防止我传递毫无意义的参数.
所以我举了这个课
class match(object):
__teams=(None,None)
def setTeams(self,tms):
if type(tms) != type(list()) and type(tms) != type(tuple()):
raise Exception("Teams must be a list of length 2")
if len(tms) != 2:
raise Exception("Teams must be a list of length 2")
if (type(tms[0])==type(str()) or (type(tms[0])==type(unicode()))) \
and (type(tms[1])==type(str()) or type(tms[1])==type(unicode())):
self.__teams=tms
else:
raise Exception("Both teams must be strings")
return
teams=property(getTeams,setTeams)
Run Code Online (Sandbox Code Playgroud)
如果我写
match1=match()
match1.teams=(2,4)
Run Code Online (Sandbox Code Playgroud)
我应该得到一个例外,但是
match1.teams[0]=5
Run Code Online (Sandbox Code Playgroud)
不会引发异常并传递数字5.请记住,这不是全部类,我只记下了与我的问题相关的内容,所以假设代码的行为和我描述的一样.
我想这是因为所有内容都是通过python中的引用传递的,但是我必须小心不要将无意义的数据分配给我的对象,这首先会破坏了拥有属性的目的.
那么,有没有办法解决这个问题,除了不使用列表或我是否必须学会使用它?
这个错误不是因为你失败了一些类型检查.
除非你歪曲了你的代码(它显然是编辑过的,因为你发布的内容无法正确运行),这种情况正在发生,因为match1.teams[0]调用你的getTeams函数,而不是你的setTeams函数.要自己查看,请尝试以下练习:
class match(object):
__teams=(None,None)
def setTeams(self,tms):
print "in set"
self.__teams = tms
def getTeams(self):
print "in get"
return self.__teams
teams=property(getTeams,setTeams)
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我得到以下内容:
>>> match1 = match()
>>> match1.teams[0]=5
in get
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> match1.teams = ["team1","team2"]
in set
>>> match1.teams[0]=5
in get
Run Code Online (Sandbox Code Playgroud)