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 解析html之BeautifulSoup
Jul 07 Python
Python自动发邮件脚本
Mar 31 Python
简单易懂的python环境安装教程
Jul 13 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
Oct 14 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
Jan 23 Python
TensorFlow Autodiff自动微分详解
Jul 06 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 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中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
PHP生成随机密码4种方法及性能对比
2020/12/11 PHP
小议Javascript中的this指针
2010/03/18 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
2019/04/11 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
使用Python抓取模板之家的CSS模板
2015/03/16 Python
简单谈谈python的反射机制
2016/06/28 Python
python使用两种发邮件的方式smtp和outlook示例
2017/06/02 Python
wxPython的安装与使用教程
2018/08/31 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
python实现在函数图像上添加文字和标注的方法
2019/07/08 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
Django的CVB实例详解
2020/02/10 Python
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
快递员岗位职责
2014/09/12 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs
详解Go语言中Get/Post请求测试
2022/06/01 Golang