| 作者:关注了🐴 Github:Github 掘金:进去看看🐴 爱好:Americano More Ice ! QQ学习交流群(new): 811792998  
 面向对象高级编程-@property当你在那个shi’yo绑定属性时,当把属性暴露出去,但没办法检查参数时。。
 话不多说,直接上菜!
 为什么需要@property看个最简单的例子,你懂s = Student()
s.height = 90
 我们可以优化一下,做下检验 class Student(object):
    def get_height(self):
         return self._height
    def set_height(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 250:
            raise ValueError('score must between 0 ~ 250!')
        self._score = value
 写完调用看下效果 >>> s = Student()
>>> s.get_height(170)
>>> s.get_height()
170
>>> s.set_height(9999)
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 250!
 有没有发现了,虽然实现了参数校验但稍许复杂呢! 当我们用上@property,有点爽class Student(object):
    @property
    def height(self):
        return self._height
    @height.setter
    def height(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 ~ 250!')
        self._score = value
 再调用试试看~ >>> s = Student()
>>> s.height = 170 
>>> s.height 
170
>>> s.height = 9999
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 250!
 @property在对实例属性操作的时候,是通过getter和setter方法来实现的,所以可以定义只读属性(只定义getter的方法)
 基于上面的例子,我们加工一下~ class Student(object):
    @property
    def height(self):
        return self._height
    @height.setter
    def height(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 ~ 250!')
        self._score = value
    @property
    def weight(self): 
        return self._weight
  
 特别注意:属性的方法名不可与实例变量重名!!原因:因为调用
 s.birth时,首先转换为方法调用,在执行return self.birth时,又视为访问self的属性,于是又转换为方法调用,造成无限递归,最终导致栈溢出报错RecursionError
 结束语:如果遇到什么疑问或者建议的,可直接留言评论!作者看到会马上一一回复如果觉得小白此文章不错或对你有所帮助,期待你的一键三连💫!?? ni ~ |