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 k-近邻算法实例分享
Jun 11 Python
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
利用python3随机生成中文字符的实现方法
Nov 24 Python
python hook监听事件详解
Oct 25 Python
python实现多进程代码示例
Oct 31 Python
pycharm远程开发项目的实现步骤
Jan 20 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
Python 下载及安装详细步骤
Nov 04 Python
Python无损压缩图片的示例代码
Aug 06 Python
Python环境使用OpenCV检测人脸实现教程
Oct 19 Python
PyQt5的QWebEngineView使用示例
Oct 20 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生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
详解JavaScript中Hash Map映射结构的实现
2016/05/21 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
js常用正则表达式集锦
2019/05/17 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
django框架实现一次性上传多个文件功能示例【批量上传】
2019/06/19 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
Python中Selenium模块的使用详解
2020/10/09 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
高职教师岗位职责
2013/12/24 职场文书
本科生的职业生涯规划范文
2014/01/09 职场文书
2015年读书月活动总结
2015/03/26 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python