對於Python中 property的理解和使用

2021-08-22 03:24:53 字數 1914 閱讀 7471

2023年09月02日 22:03:22

重看狗書,看到對user表定義的時候有下面兩行

@property

def password(self):

raise attributeerror('password is not a readable attribute')

@password.setter

def password(self, password):

self.password_hash = generate_password_hash(password)

遂重溫下這個property的使用

在我們定義資料庫欄位類的時候,往往需要對其中的類屬性做一些限制,一般用get和set方法來寫,那在python中,我們該怎麼做能夠少寫**,又能優雅的實現想要的限制,減少錯誤的發生呢,這時候就需要我們的@property閃亮登場啦,巴拉巴拉能量……..

用**來舉例子更容易理解,比如乙個學生成績表定義成這樣

class student(object):

def get_score(self):

return self._score

def set_score(self, value):

if not isinstance(value, int):

raise valueerror('score must be an integer!')

if value < 0 or value > 100:

raise valueerror('score must between 0 ~ 100!')

self._score = value

我們呼叫的時候需要這麼呼叫:

>>> s = student()

>>> s.set_score(60) # ok!

>>> s.get_score()

60>>> s.set_score(9999)

traceback (most recent call last):

...valueerror: score must between 0 ~ 100!

但是為了方便,節省時間,我們不想寫s.set_score(9999)啊,直接寫s.score = 9999不是更快麼,加了方法做限制不能讓呼叫的時候變麻煩啊,@property快來幫忙….

class student(object):

@property

def score(self):

return self._score

@score.setter

def score(self,value):

if not isinstance(value, int):

raise valueerror('分數必須是整數才行吶')

if value < 0 or value > 100:

raise valueerror('分數必須0-100之間')

self._score = value

看上面**可知,把get方法變為屬性只需要加上@property裝飾器即可,此時@property本身又會建立另外乙個裝飾器@score.setter,負責把set方法變成給屬性賦值,這麼做完後,我們呼叫起來既可控又方便

>>> s = student()

>>> s.score = 60 # ok,實際轉化為s.set_score(60)

>>> s.score # ok,實際轉化為s.get_score()

60>>> s.score = 9999

traceback (most recent call last):

...valueerror: score must between 0 ~ 100!

一文帶你搞懂python中的property

通常我們在獲得變數的一些私有屬性時,必須通過方法來獲取私有屬性,並不能直接訪問 修改其數值的時候也是要通過方法去修改,這樣非常的不方便 所以python提供了一種方式,將呼叫方法的的形式轉變為訪問屬性,這樣使用非常方便 class student def init self 這是乙個私有屬性 sel...

對於Python中 property的理解和使用

property 這個我們在很多 中都會用到,簡單講即為乙個唯讀屬性的呼叫 如果需要有修改許可權,需要再加乙個 屬性名.setter 例 usr bin env python coding utf 8 property 示例class student object propertydef score...

對於Python中yield的理解

yield常見用法 該關鍵字用於函式中會把函式包裝為generator。然後可以對該generator進行迭代 for x in fun param 在乙個函式中,程式執行到yield語句的時候,程式暫停,返回yield後面表示式的值,在下一次呼叫的時候,從yield語句暫停的地方繼續執行,如此迴圈...