Python 板


LINE

這件事情要從物件導向先開始說起。 在物件導向程式設計(Object-Oriented Programming)的理念下,我們將原本在 程序式程式設計(Procedural Programming) 中的變數和函數對應到物件的屬性 與方法,宣告類別作為實例物件的基礎,以此達到封裝(Encapsulation)、繼承 (Inhertitance)和多型(polymorphism)這三大物件導向的特性。 這裡暫且不 提其他內容,先聊聊封裝這件事: --- 在物件導向程式設計方法中,封裝是指,一種將抽象性函式介面的實作細節 部份包裝、隱藏起來的方法。同時,它也是一種防止外界呼叫端,去存取物 件內部實作細節的手段,這個手段是由程式語言本身來提供的。 --- 簡單來說,一個類別在定義時可以決定自己所屬的屬性和方法是否能夠被其他類 別所使用。在 Java 中,開發者習慣撰寫所謂的 settergetter 來對類別下 的私有屬性進行取值和賦值(或更新)的操作,在 Python 中可能會寫成這樣: ```python class MyClass: def __init__(self, value): self._value = value def get_value(self): return self._value def set_value(self, value): self._value = value # create the object my_object = MyClass(100) # get the value print(my_object.get_value()) # set the value my_object.set_value(200) ``` 只是這樣寫起來不夠 Pythonic,所以在 Python 2.2 之後新增了 @property 這 個裝飾器,讓開發者可以直接存取類別的屬性,而在需要時又可以如同使用一般 公開屬性一樣地對私有屬性進行訪問與修改: ```python class MyClass: def __init__(self, value): self._value = value @property def value(self): return self._value @value.setter def value(self, value): self._value = value # create the object my_object = MyClass(100) # get the value print(my_object.value) # set the value my_object.value = 200 ``` 這樣一來在使用起來就不用呼叫 getter 和 setter 而是採用很直觀的點操作符 來存取物件的屬性,但實際上這個屬性仍然是私有的(不過其實 Python 中的屬 性嚴格說起來並不私有... )。然而雖然取得屬性值與設定值時的作法看起來是 一樣的,但他其實是調用你所定義的不同方法,只是透過 @property 這個裝飾 器來實現這樣的結果※ 引述《Philethan (Ethan)》之銘言: : 大家好,小弟大概知道 @property 有助於日後修改 class 的參數條件限制, : 例如幾個月前我定義了球類(class Ball),接著我建立了數十顆球,現在才 : 想起我忘記強調它的半徑必須大於零,所以倘若還要制定一個 set_radius() : 來限制半徑,那麼我得回去將所有 ball.radius = 10 之類的程式碼都修改為 : ball.set_radius(10),這會很麻煩,所以就有了 @property 這種東西出來。 : 不過我不知道怎麼將上述我對 @property 的理解,應用在底下 Django 中QQ : 我正在讀 "Django Tutorial Part 8: User authentication and permissions" : https://reurl.cc/xD5g8E : 其中有一段程式碼為(https://i.imgur.com/HMcdolW.png): : @property : def is_overdue(self): : if self.due_back and date.today() > self.due_back: : return True : return False : 就我理解,這段程式碼的用意在於檢查「書籍借閱是否已過期」,所以總覺得 : 如果我拿掉 @property,好像也有相同效果?(測試結果:拿掉 @property 後, : 確實看不出有什麼異樣)。另外,這裡似乎也沒有修改資料庫中的任何資料, : 所以我就也無法用上述的「球半徑的例子」來理解這裡的 @property 用途 QQ : 另外,我有在 StackOverflow 查到: : "What the @property decorator does, is declare that : it can be accessed like it's a regular property." : https://stackoverflow.com/questions/58558989/what-does-djangos-property-do : 但我還是不太懂 QQ : 還請各位大大協助,謝謝您們! --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.247.1 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1580669992.A.EF4.html
1F:推 Philethan: @O@ 未看先推!! 02/03 09:59
2F:推 Philethan: 這讓我想起,我好像有在 python docs(?) 看到其實"取值 02/03 10:06
3F:→ Philethan: "(點操作)並不是直接取,而是會先檢查有沒有定義 02/03 10:07
4F:→ Philethan: __get__ 與 __set__,有的話那就用(就是property), 02/03 10:07
5F:→ Philethan: 沒有的話就直接取,找它的 class member 02/03 10:08
6F:→ Philethan: 所以,若在 def is_overdue(self) 前加上 @property 02/03 10:09
7F:→ Philethan: 那麼就可以更 pythonic,把 is_overdue() 函數看成 02/03 10:09
8F:→ Philethan: 一種變數,應該是這意思囉?感謝大大教學~~ 02/03 10:10
9F:→ Philethan: 雖然總覺得這種"把函數看成變數"的背後機制,似乎跟 02/03 10:10
10F:→ Philethan: 剛才提的"先檢查有沒有定義__get__與__set__"不太一樣 02/03 10:10
11F:推 Philethan: 哦哦我在 python docs 看到了! 02/03 10:14
12F:→ Philethan: The @property decorator turns the .... method into 02/03 10:15
13F:→ Philethan: a "getter" for a read-only attribute with the same 02/03 10:15
14F:→ Philethan: name. https://i.imgur.com/qmFqRvQ.png 02/03 10:17
15F:→ Philethan: https://reurl.cc/drNxOz 02/03 10:17
16F:推 cuteSquirrel: push 02/03 21:46
17F:推 Ryspon: 推個 02/06 02:16
18F:推 AugustusHsu: 推個~ 02/21 18:02
※ 編輯: Hsins (1.162.105.89 臺灣), 01/27/2021 17:20:57







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP