在类中,经常会用以下方法来定义一个类,例:
>>> 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'