02 Python 基礎教學10 所有文章

[Python教學]@property是什麼? 使用場景和用法介紹

python property

Python內建的 @property 用法,本篇描述了 property 的兩種特性,和一個實際應用上的場景,希望此篇講解對你有幫助。

Property 特性一:

 ▍特性一:將 class (類) 的方法轉換為 只能讀取的 屬性

以下是一個 @property 簡單的使用方式:

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 只能讀取的屬性特性


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 的使用範例:

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

andy = Bank_acount()
print(andy.password)
>>> 預設密碼 0000

 ▍setter

andy.password = '1234'
print(andy.password)
>>> 1234

 ▍deleter

del andy.password
print(andy.password)
>>> del complite

為什麼會需要 @property?

@property 是要實現物件導向中設計中封裝的實現方式,關於什麼是封裝和物件導向,本篇不會多加描述,可以參考這篇:
[Python教學]物件導向-Class類的封裝/繼承/多型

@property 的實際應用場景

案例:當使用者在建立會員帳號密碼時,密碼傳送進資料庫前會被加密的過程

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

user_max = User()
user_max.password = 'max'

當設定完成後,我們再度呼叫 user_max.password 方法時,會出現 password is not readable attribute 的錯誤

print(user_max.password)
>>> AttributeError: password is not readable attribute

我們只能看到加密過後的密碼 print(user_max.password_hash)

print(user_max.password_hash)
>>> pbkdf2:sha256:150000$UmuoygNu$c374750ee974eeed9ee7d6b87a0

那使用者登入時,要如何驗證密碼正確呢?
只需要將使用者登入時輸入的密碼,使用 verify_password 的方法,即可返回是正確或錯誤

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粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *