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 相关文章推荐
Windows下安装python2和python3多版本教程
Mar 30 Python
对numpy中数组元素的统一赋值实例
Apr 04 Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 Python
Pycharm如何打断点的方法步骤
Jun 13 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
python的sys.path模块路径添加方式
Mar 09 Python
python如何导入依赖包
Jul 13 Python
Python如何在单元测试中给对象打补丁
Aug 03 Python
详解Python 3.10 中的新功能和变化
Apr 28 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 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 in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
2016/12/10 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
bootstrap table 多选框分页保留示例代码
2017/03/08 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
javascript实现弹幕墙效果
2019/11/28 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
python字符串替换的2种方法
2014/11/30 Python
Python读写unicode文件的方法
2015/07/10 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
python代码实现ID3决策树算法
2017/12/20 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
技术总监的工作职责
2013/11/13 职场文书
四年级科学教学反思
2014/02/10 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
技校学生个人职业生涯规划范文
2014/03/03 职场文书
运动会口号大全
2014/06/07 职场文书
英文感谢信范文
2015/01/21 职场文书
goland 恢复已更改文件的操作
2021/04/28 Golang
JS Object构造函数之Object.freeze
2021/04/28 Javascript
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js