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实现登录接口的示例代码
Jul 21 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
详解Python修复遥感影像条带的两种方式
Feb 23 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
Python参数传递实现过程及原理详解
May 14 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 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
thinkphp的c方法使用示例
2014/02/24 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
2020/10/01 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
laravel中Redis队列监听中断的分析
2020/09/14 PHP
javascript完美拖拽的实现方法
2013/09/29 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
jQuery实现可兼容IE6的滚动监听功能
2017/09/20 jQuery
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
python发送邮件功能实现代码
2016/07/15 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
python实现简单图片物体标注工具
2019/03/18 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python使用opencv resize图像不进行插值的操作
2020/07/05 Python
python 代码运行时间获取方式详解
2020/09/18 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
房地产开盘策划方案
2014/02/10 职场文书
节约能源标语
2014/06/17 职场文书
个人总结怎么写
2015/02/26 职场文书
2019财务管理制度最新范本!
2019/07/09 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
详解Go与PHP的语法对比
2021/05/29 PHP
Python pygame实现中国象棋单机版源码
2021/06/20 Python
24年收藏2000多部退役军用电台
2022/02/18 无线电
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang