@property最大的好处就是在类中把一个方法变成属性调用,起到既能检查属性,还能用属性的方式来访问该属性的作用
class类直接将属性暴露给外界是非常不建议的!!!
普通方法
class student(object):
def __init__(self, name='', grade=0):
self._name = name
self._grade = grade
# 获取名字
def getName(self):
return self._name
# 获取成绩
def getGrade(self):
return self._grade
# 设置姓名
def setName(self, name):
self._name = name
# 对成绩做判定
def setGrade(self, grade):
if not isinstance(grade, int):
raise ValueError('grade must be an integer!')
if grade < 0 or grade > 100:
raise ValueError('grade must between 0 ~ 100!')
self._grade = grade
def runPaper(self):
print('%s的考试成绩是%s' % (self.name, self.grade))
if __name__ == '__main__':
xiaomin = student()
xiaomin.setName('小明')
print(xiaomin.getName())
try:
xiaomin.setGrade(101)
except ValueError as e:
print(e)
print(xiaomin.getGrade())
xiaomin.runPaper()
'''
小明
grade must between 0 ~ 100!
0
小明的考试成绩是0
'''
if __name__ == '__main__':
xiaomin = student()
xiaomin.setName('小明')
print(xiaomin.getName())
try:
xiaomin.setGrade(99)
except ValueError as e:
print(e)
print(xiaomin.getGrade())
xiaomin.runPaper()
'''
小明
99
小明的考试成绩是99
'''
@property用法
定义只读属性,只定义getter
方法,不定义setter
方法就是一个只读属性,比如下方的name
属性
class student(object):
def __init__(self, name='', grade=0):
self._name = name
self._grade = grade
# 修饰器 getter
@property
def name(self):
return self._name
@property
def grade(self):
return self._grade
# 对成绩做判定
@grade.setter
def grade(self, grade):
if not isinstance(grade, int):
raise ValueError('grade must be an integer!')
if grade < 0 or grade > 100:
raise ValueError('grade must between 0 ~ 100!')
self._grade = grade
def runPaper(self):
print('%s的考试成绩是%s' % (self._name, self._grade))
if __name__ == '__main__':
xiaomin = student()
# 没有setter修饰器 所以报错
xiaomin.name = '小明' #can't set attribute
if __name__ == '__main__':
xiaomin = student('小明')
print(xiaomin.name)
try:
xiaomin.grade = 101
except ValueError as e:
print(e)
print(xiaomin.grade)
xiaomin.runPaper()
'''
小明
grade must between 0 ~ 100!
0
小明的考试成绩是0
'''
if __name__ == '__main__':
xiaomin = student('小明')
print(xiaomin.name)
try:
xiaomin.grade = 99
except ValueError as e:
print(e)
print(xiaomin.grade)
xiaomin.runPaper()
'''
小明
99
小明的考试成绩是99
'''
注意如果直接将属性名作为函数名,那么属性必须设置为私有属性,否则在用s.grade
时,不知道调用函数,还是调用属性,就会犯RecursionError: maximum recursion depth exceeded in comparison
错误