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

看板Python作者時間5年前 (2020/02/04 17:03), 編輯推噓2(209)
留言11則, 4人參與, 5年前最新討論串1/1
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://www.ptt.cc/bbs/Python/M.1580807021.A.F7D.html

02/04 17:13, 5年前 , 1F
你是做字典的存取 而不是做物件屬性的存取
02/04 17:13, 1F

02/04 18:17, 5年前 , 2F
所以是字典沒辦法使用這種方式嗎?
02/04 18:17, 2F

02/04 19:34, 5年前 , 3F
實際上也不是做字典的存取,你如果把其他行註解掉,然後在
02/04 19:34, 3F

02/04 19:34, 5年前 , 4F
@property def stat() 下面新增隨便一個 print()
02/04 19:34, 4F

02/04 19:34, 5年前 , 5F
會發現你的 p1.stats['PTS'] = '-' 呼叫到的其實是 getter
02/04 19:34, 5F

02/04 19:34, 5年前 , 6F
而不是 setter。
02/04 19:34, 6F

02/04 19:37, 5年前 , 7F
由於你呼叫到了 getter 所以會返回 self._stats。接著才是
02/04 19:37, 7F

02/04 19:39, 5年前 , 8F
self._stats['PTS'] = '-'...
02/04 19:39, 8F

02/04 19:42, 5年前 , 9F
這就是為什麼你沒有跑到 setter 裡面但實際上還是賦值成功
02/04 19:42, 9F

02/04 19:42, 5年前 , 10F
的原因。
02/04 19:42, 10F

02/06 04:43, 5年前 , 11F
你要改age要用p1.age(‘-‘)
02/06 04:43, 11F
文章代碼(AID): #1UEJDjzz (Python)
文章代碼(AID): #1UEJDjzz (Python)