python属性类应用实例
一个检查修改分数的实例:
class MathScore():
def __init__(self, std_id, score):
self.std_id = std_id
if score < 0:
raise ValueError("Score can't be negative number!")
self.__score = score
def check(self):
if self.__score >= 60:
return 'pass'
else:
return 'failed'
def __get_score__(self):
return self.__score
def __set_score__(self, value):
if value < 0:
raise ValueError("Score can't be negative number!")
self.__score = value
# 实例化一个property类,取名score
score = property(__get_score__, __set_score__)
xiaoming = MathScore(10, 90)
xiaoming.score
Out[30]: 90
xiaoming.score = 80
xiaoming.score
Out[32]: 80
xiaoming.score = -90
Traceback (most recent call last):
File "<ipython-input-33-aed7397ed552>", line 1, in <module>
xiaoming.score = -90
File "C:/Users/xu_zh/.spyder2-py3/temp.py", line 28, in __set_score__
raise ValueError("Score can't be negative number!")
ValueError: Score can't be negative number!
property类用法
class property(fget=None, fset=None, fdel=None, doc=None) #类定义
- 如何调用property类创建实例:
- 在示例中通过MathScore()类创建实例时,会执行最后一段代码,从而创建了一个property()类实例score;
- 调用 property 实例(比如xiaoming.score)会直接调用 fget,并由 fget 返回相应值;
- 对 property 实例进行赋值操作(xiaoming.score = 80)则会调用 fset,并由 fset 定义完成相应操作;
- 删除 property 实例(del xiaoming),则会调用 fdel 实现该实例的删除;
- doc 则是该 property 实例的字符说明;
- fget/fset/fdel/doc 需自定义,如果只设置了fget,则该实例为只读对象;
property类语法糖
通过property语法糖,实际上创建了一个set与get方法。与私有属性相配合,在调用和设置对象属性时,程序都必将先调用set和get方法,因此在set和get代码块中可以定义一些与属性设置和调用伴生的语法操作(例如:检查属性设置是否合法),示例:
class MathScore():
def __init__(self, std_id, score):
self.std_id = std_id
if score < 0:
raise ValueError("Score can't be negative number!")
self.__score = score
def check(self):
if self.__score >= 60:
return 'pass'
else:
return 'failed'
@property
def score(self):
return self.__score
@score.setter
def score(self, value): #注意方法名称要与上面一致,否则会失效
if value < 0:
raise ValueError("Score can't be negative number!")
self.__score = value