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完全新手教程
Feb 08 Python
python下函数参数的传递(参数带星号的说明)
Sep 19 Python
python实现连接mongodb的方法
May 08 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
Python中安装easy_install的方法
Nov 18 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
python xpath获取页面注释的方法
Jan 14 Python
python实现TCP文件传输
Mar 20 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 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编写大型网站问题集
2007/03/06 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
document.all还是document.getElementsByName?
2006/07/21 Javascript
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
自己的js工具_Form 封装
2009/08/21 Javascript
jquery text()要注意啦
2009/10/30 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
微信小程序轮播图swiper代码详解
2020/12/01 Javascript
python读取Android permission文件
2013/11/01 Python
安装dbus-python的简要教程
2015/05/05 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
python中JWT用户认证的实现
2020/05/18 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
简历的自我评价
2014/02/03 职场文书
函授本科自我鉴定
2014/02/04 职场文书
教师节商场活动方案
2014/02/13 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
课外活动实习计划
2015/01/19 职场文书
晚会开幕词
2015/01/28 职场文书
学校隐患排查制度
2015/08/05 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
Java 在生活中的 10 大应用
2021/11/02 Java/Android
Golang ort 中的sortInts 方法
2022/04/24 Golang
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript