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 开发Activex组件方法
Nov 08 Python
python登陆asp网站页面的实现代码
Jan 14 Python
python中实现php的var_dump函数功能
Jan 21 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
python用户管理系统的实例讲解
Dec 23 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
关于Python的一些学习总结
May 25 Python
python带参数打包exe及调用方式
Dec 21 Python
Python语言异常处理测试过程解析
Jan 08 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
Python进行特征提取的示例代码
Oct 15 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的一些基础知识分享
2011/07/27 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
Js基础学习资料
2010/11/23 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
jquery实现鼠标悬浮停止轮播特效
2020/08/20 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
2018/02/22 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
EM算法的python实现的方法步骤
2018/01/02 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
校本教研工作方案
2014/01/14 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
自我推荐信格式模板
2015/03/24 职场文书
收入证明怎么写
2015/06/12 职场文书
实习报告怎么写
2019/06/20 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
MySQL Server层四个日志的实现
2022/03/31 MySQL