[問題] 字典使用@property裝飾器的問題

作者: jijuan   2020-02-04 17:03:39
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一樣被寫入字串'-'
請問這是什麼原因
作者: TuCH (謬客)   2020-02-04 17:13:00
你是做字典的存取 而不是做物件屬性的存取
作者: jijuan   2020-02-04 18:17:00
所以是字典沒辦法使用這種方式嗎?
作者: Hsins (翔)   2020-02-04 19:34:00
實際上也不是做字典的存取,你如果把其他行註解掉,然後在@property def stat() 下面新增隨便一個 print()會發現你的 p1.stats['PTS'] = '-' 呼叫到的其實是 getter而不是 setter。由於你呼叫到了 getter 所以會返回 self._stats。接著才是self._stats['PTS'] = '-'...這就是為什麼你沒有跑到 setter 裡面但實際上還是賦值成功的原因。
作者: ucrxzero (RX-0)   2020-02-06 04:43:00
你要改age要用p1.age(‘-‘)

Links booklink

Contact Us: admin [ a t ] ucptt.com