內建裝飾器 property

2021-07-04 11:29:43 字數 2734 閱讀 4239

使用@property

閱讀: 4164

內建裝飾器@property的基本功能就是把類中的方法當作屬性來訪問

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

s = student()

s.score = 9999

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

class

student

(object):

defget_score

(self):

return self._score

defset_score

(self, value):

ifnot 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

現在,對任意的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

defscore

(self):

return self._score

@score.setter

defscore

(self, value):

ifnot 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本身又建立了另乙個裝飾器@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

defbirth

(self):

return self._birth

@birth.setter

defbirth

(self, value):

self._birth = value

@property

defage

(self):

return

2014 - self._birth

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

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

property內建裝飾器

是乙個python內建的裝飾器,可以裝飾在 類內部的方法 上 可以將該方法呼叫方式由 物件.方法 變成 物件.方法 目的是為了迷惑呼叫者,呼叫的 方法 誤以為是 屬性 ps 在某些場景下,呼叫的方法只是用來獲取計算後的某個值。例 計算人體bmi 健康 指數 bmi weight height hei...

Python之內置裝飾器property

coding utf 8 author baoshan class student object def init self,name self.name name property defage self return self.age age.setter defage self,value i...

property裝飾器詳解

property裝飾器,看了好幾個教程都不太理解,知道發現了知乎的這篇好文python property的介紹與使用,終於懂了!下面結合github上的乙個例子,解釋一下這個裝飾器 class person object def init self,name,age 初始化 self.name na...