python中有乙個被稱為屬性函式(property)的小概念,它可以做一些有用的事情。在這篇文章中,我們將看到如何能做以下幾點:
@property
考察 student 類:
class student(object):
def __init__(self, name, score):
self.name = name
self.score = score
當我們想要修改乙個 student 的 scroe 屬性時,可以這麼寫:
s = student('bob', 59)
s.score = 60
但是也可以這麼寫:
s.score = 1000
顯然,直接給屬性賦值無法檢查分數的有效性。
如果利用兩個方法:
class student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
def get_score(self):
return self.__score
def set_score(self, score):
if score < 0 or score > 100:
raise valueerror('invalid score')
self.__score = score
這樣一來,s.set_score(1000) 就會報錯。
這種使用 get/set 方法來封裝對乙個屬性的訪問在許多物件導向程式設計的語言中都很常見。
但是寫 s.get_score() 和 s.set_score() 沒有直接寫 s.score 來得直接。
有沒有兩全其美的方法?----有。
因為python支援高階函式,在函式式程式設計中我們介紹了裝飾器函式,可以用裝飾器函式把 get/set 方法「裝飾」成屬性呼叫:
class student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property
def score(self):
return self.__score
@score.setter
def score(self, score):
if score < 0 or score > 100:
raise valueerror('invalid score')
self.__score = score
注意: 第乙個score(self)是get方法,用@property裝飾,第二個score(self, score)是set方法,用@score.setter裝飾,@score.setter是前乙個@property裝飾後的副產品。
現在,就可以像使用屬性一樣設定score了:
>>> s = student('bob', 59)
>>> s.score = 60
>>> print s.score
>>> s.score = 1000
traceback (most recent call last):
...valueerror: invalid score
說明對 score 賦值實際呼叫的是 set方法。
任務如果沒有定義set方法,就不能對「屬性」賦值,這時,就可以建立乙個唯讀「屬性」。
通過上面的**可以看出,@property 修飾函式score(getter),將score函式變成score屬性輸出,此外,@property 本身又建立了另乙個裝飾器@score.setter,負責把乙個 setter 函式變成屬性賦值,於是,我們雖然看到了類student內部定義了兩個函式score,對,沒錯,都是score,但是,他們卻被不同的裝飾器裝飾,getter函式被@property修飾,setter函式被@property建立的函式的setter裝飾器@score.setter修飾,因此,我們可以直接用s.score=90來代替s.set_socre(90),達到給score屬性賦值的效果,簡單粗暴,精益求精,雖然實現的效果一樣,但是寫起來,還是直接s.score=90來的更舒坦一些。從目的上講,@property 修飾函式就是為了讓呼叫者能用更少的**去實現同樣的功能。
拓展問題:
請給student類加乙個grade屬性,根據 score 計算 a(>=80)、b、c(<60)。
class student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
self.__grade = none
@property
def score(self):
return self.__score
@score.setter
def score(self, score):
if score < 0 or score > 100:
raise valueerror('invalid score')
self.__score = score
# 請給student類加乙個grade屬性,根據score 計算
# a( >= 80)、b、c( < 60)。
@property
def grade(self):
if self.score >= 80:
self.__grade = "a"
elif self.score >= 60:
self.__grade = "b"
else:
self.__grade = "c"
return self.__grade
s = student('bob', 59)
# print(s.grade)
s.score = 60
print(s.grade)
## s.score = 99
# print(s.grade)
分析:
新新增的grade屬性,是唯讀屬性,可以只呼叫get方法,不呼叫set方法,來實現上述功能。
總結:@property裝飾器就是負責把乙個方法變成屬性呼叫,通常用在屬性的get方法和set方法,通過設定@property可以實現例項成員變數的直接訪問,又保留了引數的檢查。另外通過設定get方法而不定義set方法可以實現成員變數的唯讀屬性。
python中的 property使用
如下 class animal object def init self,name,age self.name name self.age age a animal zhuzhu 9 a.name out 3 zhuzhu a.age out 4 9 a.age 20 a.age out 5 20在...
python 中 property的使用
從14年下半年開始接觸到python,自學了一段時間,後又跟別人學習了下,把基礎知識基本上學過了。忽然感覺python不可能這麼簡單吧,就這麼點東西?後來看了下書,發現還有很多的高階部分。連續看了兩天,把裝飾符 看了下,記錄下。裝飾符的作用就是類裡的方法變成屬性使用,比直接呼叫方法要直接簡單 直接上...
python中的 property作用
1 為什麼要使用property這個單詞 我們首先來分析一下為什麼但是龜哥會用property這個單詞,而不用foo,bar這樣的單詞呢,想必一定有他的想法。通過谷歌翻譯查到,property的意思是屬性。property 屬性 雖然我們不能猜測出 當然我不提倡亂猜 它的具體意思,但是我們可能應該想...