繫結屬性時,如果直接把屬性暴露出去,雖然寫起來很簡單,但無法對引數進行檢查,導致屬性被隨便修改
因此,可以通過在類內定義get()獲取屬性值,定義set()對屬性值進行設定並對設定值進行檢查
但通過定義get()和set()會讓程式顯得複雜,沒有直接用屬性這麼直接簡單
python內建的@property裝飾器就是用來負責把乙個方法變成屬性呼叫的,它可以通過更加簡單的方式來實現上述功能而無需自定義get()和set()
@property廣泛應用在類的定義中,可以讓呼叫者寫出簡短的**,同時保證對引數進行必要的檢查,這樣,程式執行時就減少了出錯的可能性
classstudent(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
defbirth(self):
return
self._birth
@birth.setter
def birth(self, value): #
birth是可讀寫屬性,因為它有setter
self._birth =value
#還可以定義唯讀屬性,只定義getter方法,不定義setter方法就是乙個唯讀屬性
@property
def age(self): #
age就是乙個唯讀屬性,因為它沒有setter
return 2019 -self._birth
s =student()
s.score = 60 #
ok,實際轉化為s.set_score(60)
print(s.score) #
輸出:60,實際轉化為s.get_score()
s.score = 9999 #
報預定錯誤
s.birth = 1988 #
ok,實際轉化為s.set_birth(1988)
print(s.birth) #
輸出:1988,實際轉化為s.get_birth()
print(s.age) #
輸出:31,實際轉化為s.get_age()
property屬性引數
1.讀寫屬性 預設是readwrite,會生成getter和setter方法 如果是readonly表示只會生成getter方法 2.setter處理 預設是assign 賦值 因此基本資料型別不需要加這個引數。因為在setter方法裡,我們經常要將乙個物件賦值給類的成員屬性,這個時候根據記憶體管理...
property引數講解
一 property作用 1 自動生成私有屬性 2 自動生成這個屬性的getter和setter方法的宣告 3 自動生成這個屬性的getter和setter方法的實現 注意 生成的setter方法的實現中,無論是什麼型別,都是直接賦值 二 property引數 1 property是可以帶引數的 p...
property引數的作用
property是乙個屬性訪問宣告,擴號內支援以下幾個屬性 1,getter gettername,setter settername,設定setter與getter的方法名 2,readwrite,readonly,設定可供訪問級別 2,assign,setter方法直接賦值,不進行任何retai...