作者Philethan (Ethan)
看板Python
標題[問題] Django 的 @property
時間Mon Feb 3 00:07:39 2020
大家好,小弟大概知道 @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), 來自: 123.192.0.245 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1580659662.A.F27.html
※ 編輯: Philethan (123.192.0.245 臺灣), 02/03/2020 00:19:17
推 TuCH: 加了property 你可以用 x.is_overdue 而不用x.is_overdue() 02/03 01:31
推 TuCH: 可以讓他看起來像個property, method 通常用於動詞 02/03 01:38
→ TuCH: 例如 x.check_is_overdue() or x.get_is_overdue() 02/03 01:38
→ TuCH: 例如要求球的體積 可以寫成 x.volume 而不用 x.get_volume() 02/03 01:40
→ TuCH: 或著x.volume() 02/03 01:40
哦哦!感謝你,我懂囉。確實有在 template 看到這種用法:
<
li class="{% if bookinst.is_overdue %}text-danger{% endif %}">
<
a href="{% url 'book-detail' bookinst.book.pk %}">
{{ bookinst.book.title }}<
/a>
({{ bookinst.due_back }})
<
/li>
謝謝你
※ 編輯: Philethan (123.192.0.245 臺灣), 02/03/2020 09:59:08