作者littrabble (littrabble)
看板Python
標題[問題] @property 真正的運用是啥
時間Mon Jan 6 16:52:00 2025
各位好
最近兩個月開始學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://webptt.com/m.aspx?n=bbs/Python/M.1736153522.A.5AD.html
1F:推 TimmyWendell: 我不是很有經驗的大大,但我也想加入討論XD 01/06 17:06
2F:→ TimmyWendell: 我的想法是依情境使用,以你目前舉的例子來說我覺 01/06 17:06
3F:→ TimmyWendell: 得當然沒啥用。但是如果當name有限制的時候可能會 01/06 17:06
4F:→ TimmyWendell: 比較容易撰寫。例如當name只能設為1-10,那外部人 01/06 17:06
5F:→ TimmyWendell: 輸入11的時候就能利用這個性質寫個預防name被改成1 01/06 17:06
6F:→ TimmyWendell: -10以外的東西。 01/06 17:06
7F:→ TimmyWendell: 如果有錯還請其他大大糾正,謝謝 01/06 17:06
8F:推 ck574b027: 這就是為何常說不用看教學,直接看文件。很多教學都只 01/07 13:24
9F:→ ck574b027: 是介紹有某個feature,跟文件87%像 01/07 13:25
10F:推 ck574b027: 你把setter拿掉,就知道是怎麼保護的了 01/07 13:41
11F:推 funk443: 用 setter 可以檢查使用者輸入 01/07 13:46
12F:→ leolarrel: 用obj.get_name , obj.set_name 的方式,當然也可以,這 01/07 14:30
13F:→ leolarrel: 就是 pure C的作法.python的@property是一種語法糖,你 01/07 14:33
14F:→ leolarrel: 可以google 語法糖是什麼,作用,優缺點等等 01/07 14:33
15F:→ lycantrope: 包裝越多層,效能越差 01/08 09:21
16F:推 alvinlin: 其實這東西在C#的實作是一樣的。去看看 06/14 15:07
17F:推 s860134: 1. lazy initiation, 2. cache 11/11 19:51