Python內建的 @property 用法,本篇描述了 property 的兩種特性,和一個實際應用上的場景,希望此篇講解對你有幫助。
Table
Property 特性一:
▍特性一:將 class (類) 的方法轉換為 只能讀取的 屬性
以下是一個 @property 簡單的使用方式:
1 2 3 4 |
class Bank_acount: @property def password(self): return ‘密碼:123' |
▍什麼是只能讀取的屬性?
首先我們先將 class 實例化 andy = Bank_acount(),當我們 print(andy.password) 時,可以獲得 密碼:123,當我想對 andy.password 修改時會發現程式出現了 AttributeError: can’t set attribute 的錯誤,這就是 property 只能讀取的屬性特性
1 2 3 4 5 6 7 8 |
andy = Bank_acount() print(andy.password) >>> 密碼:123 andy.password = '密碼:456' >>> AttributeError: can't set attribute |
▍只能讀取,那要怎麼修改呢?
接下來我們會在特性二看到 property 的 setter、getter 和 deleter 方法
Property 特性二:
▍特性二:重新實現一個屬性的 setter、getter 和 deleter 方法
以下是 @property 的 setter、getter 和 deleter 的使用範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Bank_acount: def __init__(self): self._password = ‘預設密碼 0000’ @property def password(self): return self._password @password.setter def password(self, value): self._password = value @password.deleter def password(self): del self._password print('del complite') |
▍getter
1 2 3 |
andy = Bank_acount() print(andy.password) >>> 預設密碼 0000 |
▍setter
1 2 3 |
andy.password = '1234' print(andy.password) >>> 1234 |
▍deleter
1 2 3 |
del andy.password print(andy.password) >>> del complite |
為什麼會需要 @property?
@property 是要實現物件導向中設計中封裝的實現方式,關於什麼是封裝和物件導向,本篇不會多加描述,可以參考這篇:
[Python教學]物件導向-Class類的封裝/繼承/多型
@property 的實際應用場景
案例:當使用者在建立會員帳號密碼時,密碼傳送進資料庫前會被加密的過程
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from werkzeug.security import generate_password_hash, check_password_hash class User: @property def password(self): raise AttributeError('password is not readable attribute') @password.setter def password(self, password): self.password_hash = generate_password_hash(password) def verify_password(self, password): return check_password_hash(self.password_hash, password) |
首先我們將 class 實例化 user_max = User(),我們使用 @password.setter 的方式,來設定 user_max 的密碼是 max
1 2 |
user_max = User() user_max.password = 'max' |
當設定完成後,我們再度呼叫 user_max.password 方法時,會出現 password is not readable attribute 的錯誤
1 2 |
print(user_max.password) >>> AttributeError: password is not readable attribute |
我們只能看到加密過後的密碼 print(user_max.password_hash)
1 2 |
print(user_max.password_hash) >>> pbkdf2:sha256:150000$UmuoygNu$c374750ee974eeed9ee7d6b87a0 |
那使用者登入時,要如何驗證密碼正確呢?
只需要將使用者登入時輸入的密碼,使用 verify_password 的方法,即可返回是正確或錯誤
1 2 3 4 5 |
print(user_max.verify_password('max')) >>> True print(user_max.verify_password('cat')) >>> False |
以上就是一個簡單的 @property 使用場景案例
總結一下:
本篇討論了Property的兩個用法:
1. 將 class (類) 的方法轉換為 只能讀取的 屬性
2. 重新實現一個屬性的 setter、getter 和 deleter 方法
如果對 class 中的什麼是類和方法不太了解的話,可以參考這篇:
[Python教學]物件導向-Class類的封裝/繼承/多型
如果對@裝飾詞是什麼想了解的話,可以參考這篇:
[Python教學] 裝飾詞原理到應用
除了 @property 外,還有什麼好用的方法有興趣的話,可以參考:
[Python教學] Class / Static /Abstract Method 初探
那麼 [Python教學]@Property是什麼? 結束囉,感謝收看!
有關Max行銷誌的最新文章,都會發佈在Max的Facebook粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!
在〈[Python教學] @property是什麼? 使用場景和用法介紹〉中有 1 則留言
好讚!謝謝你的文章