1. 程式人生 > >python基礎之類的property用法

python基礎之類的property用法

在類中,經常會用以下方法來定義一個類,例:

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

(self):
        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'