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語句暫停的地方繼續執行,如此迴圈...