介紹Python的 property裝飾器的用法

2022-10-04 09:03:10 字數 2351 閱讀 8807

在繫結屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查引數,導致可以把成績隨便改:

s = student()

s.score = 9999

這顯然不合邏輯。為了限制score的範圍,可以通過乙個set_score()方法來設定成績,再通過乙個get_score()來獲取成績,這樣,在set_score()方法裡,就可以檢查引數:

class student(object):

def get_score(self):

return self._score

def set_score(self, value):

if not www.cppcns.comisinstance(value, int):

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

if value 100:

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

self._score = value

現在,對任意的student例項進行操作,就不能隨心所欲地設定score了:

>>> 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!

但是,上面的呼叫方法又略顯複雜,沒有直接用屬性這麼直接簡單。

有沒有既能檢查引數,又可以用類似屬性這樣簡單的方式來訪問類的變數呢?對於追求完美的python程式設計師來說,這是必須要做到的!

還記得裝飾器(decorator)可以給函式動態加上功能嗎?對於類的方法,裝飾器一樣起作用。python內建的@property裝飾器就是負責把乙個方法變成屬性呼叫的:

class student(object):

@property

def score(self):

return self._score

@score.setter

def 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

@property的實現比較複雜,我們先考察如何使用。把乙個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又建立www.cppcns.com了另乙個裝飾器@score.setter,負責把乙個setter方法變成屬性賦值,於是,我們就擁有乙個可控的屬性操作:

>>> 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!

注意到這個神奇的@property,我們在對例項屬性操作的時候,就知道該屬性很可能不是直接暴露的,而是通過getter和setter方法來實現的。

還可以定義唯讀屬性,只定義getter方法,不定義setter方法就是乙個唯讀屬性:

class student(object):

@property

def birth(self):

return self._birth

@www.cppcns.combirth.setter

def birth(self, value):

self._birth = value

@property

def age(self):

return 2014 - self._birth

上面的birth是可讀寫屬性,而age就是乙個唯讀屬性,因為age可以根據birth和當前時間計算出來。

小結@property廣泛應用在類的定義中,可以讓呼叫者寫出簡短的**,同時保證對引數進行必要的檢查,這樣,程式執行時就減少了出錯的可能性。

本文標題: 介紹python的@property裝飾器的用法

本文位址: /jiaoben/python/123663.html

一文帶你搞懂python中的property

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

python類的介紹 Python 類的介紹

如何建立類 class 類名 pass eg class bar 定義乙個類 def foo self,arg self 永遠是呼叫方法的物件,即中間人 print self,self.name,self.age,arg obj bar 使用 bar 類,建立乙個物件 obj print obj o...

Python簡單的介紹

現在來簡單的介紹一下什麼是python,它是一種解釋型 物件導向和動態資料型別的高階程式語言。它誕生於1989年底發明它的發明者為guido van rossum 人稱海叔 它的第乙個公開的發行版發行於1991年。現在python 2.x版本的已經沒用了聽說學習課程的老師說它2x版的可能在2020年...