python @property的用法及含义全面解析


Posted in Python onFebruary 01, 2018

在接触python时最开始接触的代码,取长方形的长和宽,定义一个长方形类,然后设置长方形的长宽属性,通过实例化的方式调用长和宽,像如下代码一样。

class Rectangle(object):
  def __init__(self):
    self.width =10
    self.height=20
r=Rectangle()
print(r.width,r.height)

此时输出结果为10 20

但是这样在实际使用中会产生一个严重的问题,__init__ 中定义的属性是可变的,换句话说,是使用一个系统的所有开发人员在知道属性名的情况下,可以进行随意的更改(尽管可能是在无意识的情况下),但这很容易造成严重的后果。

class Rectangle(object):
  def __init__(self):
    self.width =10
    self.height=20
r=Rectangle()
print(r.width,r.height)
r.width=1.0
print(r.width,r.height)

以上代码结果会输出宽1.0,可能是开发人员不小心点了一个小数点上去,但是会系统的数据错误,并且在一些情况下很难排查。

这是生产中很不情愿遇到的情况,这时候就考虑能不能将width属性设置为私有的,其他人不能随意更改的属性,如果想要更改只能依照我的方法来修改,@property就起到这种作用(类似于java中的private)

class Rectangle(object):
  @property
  def width(self):
    #变量名不与方法名重复,改为true_width,下同
    return self.true_width

  @property
  def height(self):
    return self.true_height
s = Rectangle()
#与方法名一致
s.width = 1024
s.height = 768
print(s.width,s.height)

(@property使方法像属性一样调用,就像是一种特殊的属性)

此时,如果在外部想要给width重新直接赋值就会报AttributeError: can't set attribute的错误,这样就保证的属性的安全性。

同样为了解决对属性的操作,提供了封装方法的方式进行属性的修改

class Rectangle(object):
  @property
  def width(self):
    # 变量名不与方法名重复,改为true_width,下同
    return self.true_width
  @width.setter
  def width(self, input_width):
    self.true_width = input_width
  @property
  def height(self):
    return self.true_height
  @height.setter
  #与property定义的方法名要一致
  def height(self, input_height):
    self.true_height = input_height
s = Rectangle()
# 与方法名一致
s.width = 1024
s.height = 768
print(s.width,s.height)

此时就可以对“属性”进行赋值操作,同样的方法还del,用处是删除属性,写法如下,具体实现不在赘述。

@height.deleter
def height(self):
    del self.true_height

总结一下@property提供了可读可写可删除的操作,如果像只读效果,就只需要定义@property就可以,不定义代表禁止其他操作。

以上这篇python @property的用法及含义全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
python生成tensorflow输入输出的图像格式的方法
Feb 12 Python
python中abs&map&reduce简介
Feb 20 Python
python 构造三维全零数组的方法
Nov 12 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
django-filter和普通查询的例子
Aug 12 Python
使用Python实现Wake On Lan远程开机功能
Jan 22 Python
在Sublime Editor中配置Python环境的详细教程
May 03 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
QML实现钟表效果
Jun 02 Python
Python配置pip国内镜像源的实现
Aug 20 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 #Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 #Python
Python命令行解析模块详解
Feb 01 #Python
python2.7到3.x迁移指南
Feb 01 #Python
Python Paramiko模块的使用实际案例
Feb 01 #Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 #Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 #Python
You might like
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
jQuery编写网页版2048小游戏
2017/01/06 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
python实现RSA加密(解密)算法
2016/02/17 Python
Python制作简易注册登录系统
2016/12/15 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
opencv与numpy的图像基本操作
2019/03/08 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
自荐信怎么写呢?
2013/12/09 职场文书
餐饮加盟计划书
2014/01/10 职场文书
餐饮营销方案
2014/02/23 职场文书
毕业证代领委托书
2014/09/26 职场文书
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
Redis中缓存穿透/击穿/雪崩问题和解决方法
2021/12/04 Redis