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中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
python解析xml文件操作实例
Oct 05 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
python+opencv轮廓检测代码解析
Jan 05 Python
pygame游戏之旅 添加碰撞效果的方法
Nov 20 Python
用pycharm开发django项目示例代码
Jun 13 Python
python图片二值化提高识别率代码实例
Aug 24 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
ipython jupyter notebook中显示图像和数学公式实例
Apr 15 Python
vscode调试django项目的方法
Aug 06 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
实现“上一页”和“下一页按钮
2006/10/09 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
概述jQuery的元素筛选
2016/11/23 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
javascript事件循环event loop的简单模型解释与应用分析
2020/03/14 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
Python实现的简单发送邮件脚本分享
2014/11/07 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
老生常谈Python基础之字符编码
2017/06/14 Python
Python3中的bytes和str类型详解
2019/05/02 Python
pytorch进行上采样的种类实例
2020/02/18 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
英国DIY汽车维修配件网站:DIY Car Service Parts
2019/08/30 全球购物
服装公司总经理岗位职责
2013/11/30 职场文书
对标管理实施方案
2014/03/12 职场文书
2015年元旦活动总结
2014/05/09 职场文书
普通党员个人整改措施
2014/10/27 职场文书
文明单位汇报材料
2014/12/24 职场文书
Python 中random 库的详细使用
2021/06/03 Python
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python