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 (2)
Oct 31 Python
Python(Tornado)模拟登录小米抢手机
Nov 12 Python
Python获取当前路径实现代码
May 08 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
Keras 实现加载预训练模型并冻结网络的层
Jun 15 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
利用python制作拼图小游戏的全过程
Dec 04 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
python如何实现递归转非递归
Feb 25 Python
详解Python如何批量采集京东商品数据流程
Jan 22 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 a simple smtp class
2007/11/26 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
php生成图片验证码的方法
2016/04/15 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
对联广告js flash激活
2006/10/19 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
详细解读Jquery各Ajax函数($.get(),$.post(),$.ajax(),$.getJSON())
2016/08/15 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
python实现经纬度采样的示例代码
2020/12/10 Python
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
日语专业推荐信
2013/11/12 职场文书
童装店创业计划书
2014/01/09 职场文书
个人能力自我鉴赏
2014/01/25 职场文书
高校十八大报告感想
2014/01/27 职场文书
无犯罪记录证明范本
2014/09/15 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
开学典礼致辞
2015/07/29 职场文书
读《钢铁是怎样炼成的》有感:百炼方成钢
2019/11/05 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python