作者jijuan ()
看板Python
标题[问题] 字典使用@property装饰器的问题
时间Tue Feb 4 17:03:39 2020
class Player():
def __init__(self):
self._age = 0
self._stats = {'PTS': 0, 'SCORE': 0}
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if isinstance(age, int):
self._age = age
else:
self._age = 0
@property
def stats(self):
return self._stats
@stats.setter
def stats(self, val):
if isinstance(val, int):
self._stats = val
else:
self._stats = 0
p1 = Player()
p1.age = '-'
p1.stats['PTS'] = '-'
p1.stats['SCORE'] = 200
print(p1.age, p1.stats['PTS'], p1.stats['SCORE'])
输出结果是
0 - 200
请问在age和stats的setter里一样做了型别的判断
结果只有对age有用
stats一样被写入字串'-'
请问这是什麽原因
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.38.80.98 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1580807021.A.F7D.html
1F:推 TuCH: 你是做字典的存取 而不是做物件属性的存取 02/04 17:13
2F:→ jijuan: 所以是字典没办法使用这种方式吗? 02/04 18:17
3F:→ Hsins: 实际上也不是做字典的存取,你如果把其他行注解掉,然後在 02/04 19:34
4F:→ Hsins: @property def stat() 下面新增随便一个 print() 02/04 19:34
5F:→ Hsins: 会发现你的 p1.stats['PTS'] = '-' 呼叫到的其实是 getter 02/04 19:34
6F:→ Hsins: 而不是 setter。 02/04 19:34
7F:→ Hsins: 由於你呼叫到了 getter 所以会返回 self._stats。接着才是 02/04 19:37
8F:→ Hsins: self._stats['PTS'] = '-'... 02/04 19:39
9F:→ Hsins: 这就是为什麽你没有跑到 setter 里面但实际上还是赋值成功 02/04 19:42
10F:→ Hsins: 的原因。 02/04 19:42
11F:推 ucrxzero: 你要改age要用p1.age(‘-‘) 02/06 04:43