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 相关文章推荐
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
利用python将图片转换成excel文档格式
Dec 30 Python
Python实现合并两个列表的方法分析
May 28 Python
Python合并多个Excel数据的方法
Jul 16 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
python读取与处理netcdf数据方式
Feb 14 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 Python
Python读写压缩文件的方法
Jul 30 Python
python时间time模块处理大全
Oct 25 Python
python切片作为占位符使用实例讲解
Feb 17 Python
Python中seaborn库之countplot的数据可视化使用
Jun 11 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运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
div层的移动及性能优化
2010/11/16 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
图解JS原型和原型链实现原理
2020/09/15 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
[36:14]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第二局
2016/02/28 DOTA
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-> (一千零一拾一元整)输出
2015/05/29 面试题
学习心得体会
2014/01/01 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
综合实践活动报告
2015/02/05 职场文书
公司催款律师函
2015/05/27 职场文书
死亡诗社观后感
2015/06/05 职场文书
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL
postgresql中如何执行sql文件
2023/05/08 PostgreSQL