python基礎之類的property用法
阿新 • • 發佈:2018-12-08
在類中,經常會用以下方法來定義一個類,例:
>>> class student(object): def __init__(self): self.__englishScore=0 def getScore(self): #獲取屬性值的方法 return self.__englishScore def setScore(self,value): #設定屬性值的方法 if value>=0 and value<=100: self.__englishScore=value else: print("輸入有誤,重新輸入") >>> a=student() >>> a.setScore(83) #通過setScore方法設定屬性值 >>> a.getScore() #通過getScore 方法獲取屬性值 83
以上程式碼,建立了一個物件a,物件a的屬性賦值,訪問要通過setScore( )和getScore( )方法訪問,有點麻煩,能不能直接用
a.score=83,print(a.socre)?可以,因為Python支援高階函式,可以用裝飾器函式把 get/set 方法“裝飾”成屬性呼叫:
>>> class student(object): def __init__(self): self.__englishScore=0 @property #裝飾get方法 def englishScore(self): return self.__englishScore @englishScore.setter #裝飾set方法 def englishScore(self,value): if value>=0 and value<=100: self.__englishScore=value else: print("輸入有誤,重新輸入") >>> a=student() >>> a.englishScore=83 >>> a.englishScore 83
注意: 第一個englishScore(self)是get方法,用@property裝飾,第二個englishScore(self, score)是set方法,用@englishScore.setter裝飾,@englishScore.setter是前一個@property裝飾後的副產品。
注意:以下紅色部分是裝飾後的屬性名稱,如果將“englishScore"改成"ss",在建立物件後就要用a.ss=83了。
class student(object):
def __init__(self):
self.__englishScore=0
@property
def englishScore
return self.__englishScore
@englishScore.setter
def englishScore(self,value):
if value>=0 and value<=100:
self.__englishScore=value
else:
print("輸入有誤,重新輸入")
一句話總結:@property將get和set方法裝飾成屬性,物件直接呼叫裝飾後的屬性,不必再呼叫get和set方法。
利用@property為屬性設定只讀。例:
>>> class student(object):
def __init__(self):
self.__englishScore=0
self.__mathScore=0
#-----------------------------------englishScore-----------------------------------------
@property
def englishScore(self):
return self.__englishScore
@englishScore.setter
def englishScore(self,value):
self.__englishScore=value
#-----------------------------------mathScore-----------------------------------------
@property
def mathScore(self):
return self.__mathScore
@mathScore.setter
def mathScore(self,value):
self.__mathScore=value
#-----------------------------------core-----------------------------------------
@property
def score(self):
return self.__englishScore+self.__mathScore
>>> a=student()
>>> a.englishScore=78
>>> a.mathScore=67
>>> a.englishScore
78
>>> a.mathScore
67
>>> a.score
145
property在python3中的另外一種用法:
>>> class student(object):
__slots__=["__englishScore"] #限定屬性,用來證明此種方法的有效
def __init__(self):
self.__englishScore=0
def getScore(self): #設定get方法
return self.__englishScore
def setScore(self,value): #設定set方法
self.__englishScore=value
#-----------------------------------------property的使用-------------------------------------
englishScore=property(getScore,setScore) #使用property
#-----------------------------------------property的使用-------------------------------------
>>> a=student()
>>> a.englishScore=87
>>> a.englishScore
87
>>> a.math=93 #不允許新增變數,證明上面的englishScore是裝飾器裝飾出來的,不是動態新增的
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
a.math=93
AttributeError: 'student' object has no attribute 'math'