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中的高级函数map/reduce使用实例
Apr 13 Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
Python Json序列化与反序列化的示例
Jan 31 Python
使用python脚本实现查询火车票工具
Jul 19 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
解决Python使用列表副本的问题
Dec 19 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
Apr 30 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
python爬虫scrapy基于CrawlSpider类的全站数据爬取示例解析
Feb 20 Python
python glom模块的使用简介
Apr 13 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 MemCached 高级缓存应用代码
2010/08/05 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
Laravel 修改默认日志文件名称和位置的例子
2019/10/17 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
javascript 动态添加表格行
2006/06/22 Javascript
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
JavaScript自定义分页样式
2017/01/17 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
JS正则表达式判断有效数实例代码
2017/03/13 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
Python3安装Scrapy的方法步骤
2017/11/23 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Python代码实现KNN算法
2017/12/20 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
pyspark 随机森林的实现
2020/04/24 Python
测绘工程专业个人自我评价
2013/12/01 职场文书
初三学生个人自我评定
2014/04/06 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏