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 Web开发框架Django
Jun 30 Python
python在windows下实现备份程序实例
Jul 04 Python
Python调用C/C++动态链接库的方法详解
Jul 22 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
简单谈谈Python的pycurl模块
Apr 07 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
python中matplotlib条件背景颜色的实现
Sep 02 Python
python的faker库用法
Nov 28 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 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编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
AJAX分页的代码(后台asp.net)
2011/02/14 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
详解python开发环境搭建
2016/12/16 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
2019/08/26 Python
Python enumerate内置库用法解析
2020/02/24 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
30行Python代码实现高分辨率图像导航的方法
2020/05/22 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
2019年分享net面试的经历和题目
2016/08/07 面试题
一套Delphi的笔试题二
2013/05/11 面试题
MySQL表字段数量限制及行大小限制详情
2022/07/23 MySQL