看板 Python 關於我們 聯絡資訊
各位好 最近兩個月開始學python, 有些問題實在是搞不懂, 其中一個是 @property 我看很多教學都說是保護變數, 例如 @property def name(self): return self._name @name.setter def name(self, new_name): self._name = new_name 然後可以使用 instance p, p.name 取值, p.name = 1 設值 我的疑問是, 1. 這根本無法保護變數,為什麼教程還要說這種寫法保護變數 2. 加那個@property @name.setter, 到底有什麼好處? 我如果不使用@property, 而是把方法名稱改成 get_name, 跟 set_name 程式碼讀起來,不是更清楚明白嗎? 有沒有很有經驗的大大,能幫我解惑一下 感恩 -- Sent from nPTT on my iPhone 12 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.227.112.12 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1736153522.A.5AD.html
TimmyWendell: 我不是很有經驗的大大,但我也想加入討論XD 01/06 17:06
TimmyWendell: 我的想法是依情境使用,以你目前舉的例子來說我覺 01/06 17:06
TimmyWendell: 得當然沒啥用。但是如果當name有限制的時候可能會 01/06 17:06
TimmyWendell: 比較容易撰寫。例如當name只能設為1-10,那外部人 01/06 17:06
TimmyWendell: 輸入11的時候就能利用這個性質寫個預防name被改成1 01/06 17:06
TimmyWendell: -10以外的東西。 01/06 17:06
TimmyWendell: 如果有錯還請其他大大糾正,謝謝 01/06 17:06
ck574b027: 這就是為何常說不用看教學,直接看文件。很多教學都只 01/07 13:24
ck574b027: 是介紹有某個feature,跟文件87%像 01/07 13:25
ck574b027: 你把setter拿掉,就知道是怎麼保護的了 01/07 13:41
funk443: 用 setter 可以檢查使用者輸入 01/07 13:46
leolarrel: 用obj.get_name , obj.set_name 的方式,當然也可以,這 01/07 14:30
leolarrel: 就是 pure C的作法.python的@property是一種語法糖,你 01/07 14:33
leolarrel: 可以google 語法糖是什麼,作用,優缺點等等 01/07 14:33
lycantrope: 包裝越多層,效能越差 01/08 09:21
alvinlin: 其實這東西在C#的實作是一樣的。去看看 06/14 15:07
s860134: 1. lazy initiation, 2. cache 11/11 19:51