@property for Python

来源:互联网 发布:章莹颖死亡细节知乎 编辑:程序博客网 时间:2024/05/23 00:31

@property

  • 解决的问题:

    • 调用方法像直接用属性一样直接简单。
  • 思路:

    • 将方法包安装成属性。
      • 即对def fun()方法进行包装。
Python内置的@property装饰器就是负责把一个方法变成属性调用的

==============================================

无@property

class Student(object):    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
分析:
  • 一个get_score方法, 一个set_score方法
>>> s = Student()>>> s.set_score(60) # ok!>>> s.get_score()60>>> s.set_score(9999)Traceback (most recent call last):  ...ValueError: score must between 0 ~ 100!

有@property

class Student(object):    # AA处get    @property    def score(self):        return self._score    # BB处set    @score.setter    def 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
分析:
  • 给score方法加上@property,self_score为实例的假私有属性。可能理解为:对score进行包装成Student的类属性。
  • 给score方法又加上@score.setter。可以理解为:对.score方法当做属性用时去执行BB处的代码。(一般先有属性,再去设置改变属性)
  • 把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作。
>>> s = Student()>>> s.score = 60    # OK,实际转化为s.set_score(60)>>> s.score         # OK,实际转化为s.get_score()60>>> s.score = 9999Traceback (most recent call last):  ...ValueError: score must between 0 ~ 100!
结论:

装饰后可以直接使用s.score,s.score=scoreNo;而不像无装饰前s.get_score(),s.set_score(60)那样将【设置参数放在括号里去设置】和【方法()】访问。

以上:解决了调用方法像直接用属性一样直接用的问题,使使用起来更加简单。
0 0
原创粉丝点击