zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【问题解决方案】单个文件夹嵌套时github仓库中最外层文件夹直接显示所有嵌套文件夹名的问题
    【问题解决方案】本地仓库删除远程库后添加到已有github仓库时仓库地址找不到的问题(github仓库SSH地址)
    【问题解决方案】git/github本地和远程仓库的重命名
    【学习总结】《大话数据结构》- 总
    【机器学习】李宏毅机器学习-Keras-Demo-神经网络手写数字识别与调参
    【问题解决方案】Keras手写数字识别-ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接
    【学习总结】win7使用anaconda安装tensorflow+keras
    【问题解决方案】AttributeError: module 'pygal' has no attribute 'Worldmap'
    【问题解决方案】ImportError: No module named 'pygal'
    【问题解决方案】Github中的jupyter notebook文件(.ipynb)加载失败/失败
  • 原文地址:https://www.cnblogs.com/for-master/p/10008524.html
Copyright © 2011-2022 走看看