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'

猜你喜欢

转载自blog.csdn.net/Panda996/article/details/84849066
今日推荐