1. 程式人生 > 程式設計 >Python @property原理解析和用法例項

Python @property原理解析和用法例項

這篇文章主要介紹了Python @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 #@score.setter是前一個@property裝飾後的副產品。
  def score(self,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!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。