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基本数据类型详细介绍
Mar 11 Python
Python中random模块用法实例分析
May 19 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
Python 爬虫的工具列表大全
Jan 31 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
Python编程求质数实例代码
Jan 31 Python
解决Django加载静态资源失败的问题
Jul 28 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
django连接oracle时setting 配置方法
Aug 29 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
Python读取实时数据流示例
Dec 02 Python
利用python做数据拟合详情
Nov 17 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 中的输出缓冲
2006/12/21 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
php微信公众号开发模式详解
2016/11/28 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
JQuery 使用attr方法实现下拉列表选中
2014/10/13 Javascript
基于JS实现Android,iOS一个手势动画效果
2016/04/27 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
在 webpack 中使用 ECharts的实例详解
2018/02/05 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
Node.js中出现未捕获异常的处理方法
2020/06/29 Javascript
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
python如何实现反向迭代
2018/03/20 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
Python中的heapq模块源码详析
2019/01/08 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
Python整数对象实现原理详解
2019/07/01 Python
pycharm永久激活超详细教程
2020/10/29 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
最新的大学生找工作自我评价
2013/09/29 职场文书
军训教官感言
2014/03/02 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书