• Python 装饰器 property() 函数


    描述:property() 函数的作用是在新式类中返回属性值。

       @property 装饰器简单理解就是负责把一个方法变成属性调用

    下面理解property()方法语法:

    class property([fget[, fset[, fdel[, doc]]]])
    

    参数:fget-获取属性值的函数;fset-设置属性值的函数;fdel-删除属性值函数;doc-属性描述信息

    实例

    class C(object):
            def __init__(self):
                    self._x = None
    
            def getx(self):
                    return self._x
    
            def setx(self):
                    self._x = value
    
            def delx(self):
                    del self._x
    
            x = property(getx, setx, delx, "I'm the 'x' property.")
    

    实例化结果:

    注:c 是类C的实例化

    1、c.x  触发getter;2、c.x = value 触发setter;3、del c.x 触发 deleter 

    ————————————————————    @property   ——————————————————————————————

    将property 函数用作@property装饰器详解:

    getter、setter、deleter方法用作装饰器

     1 class C(object):
     2     def __init__(self):
     3         self._x = None
     4 
     5     @property
     6     def x(self):
     7         """I'm the 'x' property."""
     8         return self._x
     9     
    10     @x.setter
    11     def x(self, value):
    12         self._x = value
    13 
    14     @x.deleter
    15     def x(self):
    16          del self._x        

    理解以上,下面来考虑实际场景。

    在绑定属性时,如果直接把属性暴露出去,写起来简单,但是没有办法检查参数,导致成绩可以随便改变:

    s = Student()
    s.score = 9999 #成绩未做校验

    为了限制score范围,通过set_score()方法来设置成绩,再通过get_score()获取成绩,在set_score()里面

    检查参数:

     1 class Student(object):
     2 
     3     def get_score(self):
     4 
     5             return self._score
     6 
     7     def set_score(self, value):
     8 
     9             if not isinstance(value, int):
    10 
    11                 raise ValueError('score must be an integer!')
    12 
    13             if value <0 or value > 100:
    14 
    15                 raise ValueError('score must between 0~100 !')
    16 
    17             self._score = value

    现在对任意的Student实例进行操作,score就产生了限制:

    >>>s = Student() #实例化
    >>>s.set_score(60)
    >>>s.get_score() #执行get获取成绩
    60
    >>>s.set_score(9999)#执行set方法校验
    Traceback (most recent call last):
      ...
    ValueError: score must between 0 ~ 100!

    以上为常规方法实现,下面应用Python内置的@property装饰器负责把一个方法变成属性调用:

     1 class Student(object):
     2     
     3     @property
     4     def score(self):            #加上@property 把getter方法变成属性
     5             return self._score
     6 
     7     @score.setter         # 加上@score.setter 把setter方法变成属性赋值
     8     def score(self, value):
     9 
    10         if not isinstance(value, int):
    11             raise ValueError('score must be an integer!')
    12 
    13         if value < 0 or value > 100:
    14             raise ValueError('score must between 0 ~ 100!')
    15 
    16         self._score = value 
    17             

    可控属性操作:

    1 >>>s =Student()
    2 >>>s.score = 60 #属性赋值操作,实际转化为s.set_score(60)
    3 >>>s.score         #获取属性操作,实际转化为s.get_score()
    4 60
    5 >>> s.score = 9999
    6 Traceback (most recent call last):
    7   ...
    8 ValueError: score must between 0 ~ 100!

    注意这个@property,我们在对实例属性操作时,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现。

    可以定义只读属性,只定义getter方法,不一定setter方法就是一个只读属性:

     1 class Student(object):
     2     
     3     @property
     4     def birth(self):
     5         return self._birth
     6 
     7     @birth.setter
     8     def birth(self, value):
     9         self._birth = value
    10 
    11     @property
    12     def age(self):
    13         return 2015 - self._birth

    birth 是可读可写属性,age是只读属性

    注:额外函数的名字和property下的一样。

    到此,整个property装饰器理解结束,写进博客做记录。

    本次资料源自:

    廖雪峰:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186781871161bc8d6497004764b398401a401d4cce000

    菜鸟教程:

    http://www.runoob.com/python/python-func-property.html

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 矩阵加法
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 乘法表
    监管只是压倒网盘业务的一根稻草,但不是主要原因(答案只有一个:成本!)
  • 原文地址:https://www.cnblogs.com/for-master/p/10008524.html
Copyright © 2020-2023  润新知