property属性
在python中使用property属性有两种方法:使用@property装饰器和使用property()函数。(通过廖雪峰官网实例来对此加深认识)
# property装饰器就是负责把一个方法变成属性调用 class Student(object): def __init__(self, score=0): self._score = score @property # 像访问属性一样访问方法,这个不要写成socre.getter,这点要注意,和下面的get_score是一个意思 def score(self): print("getting score") return self._score @score.setter # 在给属性赋值的时候做了验证,注意这三个方法的名称必须一致,和下面的set_score是一个意思 def score(self, value): print("setting score") if not isinstance(value, int): raise ValueError("score must be an integer!") if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value @score.deleter def score(self): # 删除逻辑,这三个方法名称必须是一致,和下面的del_score是一个意思 del self._score s = Student(-10) print(s.score) print("=====================") s.score = 88 print(s.score)
property()当为函数时,默认有4个参数,分别为:fget,fset,fdel,doc,下面是使用方法
# 使用property函数 class Student(object): def __init__(self, score=0): self._score = score def get_score(self): return self._score def set_score(self, value): if not isinstance(value, int): raise ValueError("score must be an integer!") if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value def del_score(self): del self._score score = property(fget=get_score, fset=set_score, fdel=del_score) # 如果不使用关键字赋值,注意顺序不要搞错了:fget,fset,fdel,doc # 这里的这个名称必须和属性名称一致,否则没办法用属性名来调用 s = Student(-10) print(s.score) # 自动调用上面的get_socre print("=====================") s.score = 88 # 自动调用上面的set_score方法 print(s.score) # 自动调用上面的get_socre方法 del s.score # 自动调用上面的del_score方法
总结:
使用property装饰器和property函数实现的功能是一样的,注意对比着看方便记忆和理解