存取器
變數加上二個底線就變成了private, 最主要的目的是要進行封裝, 讓外界不得任易更改. 為了能存取此變數, 就會再加上getter/setter進行檢查及限制.
所以在使用上, 只可以調用getter/setter. 但在使用getter/setter總是沒有直接存取變數那麼方便, 至少調用getter/setter還要加上 “()”.
超級懶的我們總是會想, 如果可以直接存取private變數, 然後又可以執行檢查的工作, 那這世界該有多美滿. 懶成這個樣子, 那是不是要考慮轉行呢!! 其實我也不是很愛寫程式, 我只是為了生活. 我寫程式不是為了錢, 純粹為了生活. (曾馨瑩也絕對不是為了錢而嫁給那老頭, 純粹是為了生活)
@property
@Property這個裝籂子又出來普渡世人了. 先定義一個跟變數同名字的方法, 然後把變數名改成其他名字, 比如前面多加一個底線, 如 _level, 然後此方法就return _level
接下來, 再level 方法上面加入 @property. 如此外界就只要寫 p1.level就會返回 _level的值. 請注意喔, 不是p1.level(), 因為加了@property, 所以不用 “()”
接下來就是底下紅色的部份, 用來規定當設定時要作的事, 及讀取時要作的事(放大10倍)
請注意, setter及getter的方法名稱, 一定要跟property的名稱一樣, 都是 def level()
class Pokemon(object): @property def level(self): return self._level @level.setter def level(self, l): if l > 10 : self._level=1 else: self._level=l @level.getter def level(self): return self._level*10 p1=Pokemon() p1.level=8 print(p1.level)
唯讀
在上述的代碼中, 把setter拿掉, 就變成唯讀了