Python特殊属性property原理及使用方法解析


Posted in Python onOctober 09, 2020

1 什么是特性property

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

import math
class Circle:
  def __init__(self,radius): #圆的半径radius
    self.radius=radius

  @property
  def area(self):
    return math.pi * self.radius**2 #计算面积

  @property
  def perimeter(self):
    return 2*math.pi*self.radius #计算周长

c=Circle(10)
print(c.radius)
print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
print(c.perimeter) #同上
'''
输出结果:
314.1592653589793
62.83185307179586
'''

注意:此时的特性arear和perimeter不能被赋值

c.area=3 #为特性area赋值
'''
抛出异常:
AttributeError: can't set attribute
'''

2 为什么要用property

将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

除此之外,看下

ps:面向对象的封装有三种方式:

【public】

这种其实就是不封装,是对外公开的

【protected】

这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开

【private】

这种封装对谁都不公开

python并没有在语法上把它们三个内建到自己的class机制中,在C++里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现

class Foo:
  def __init__(self,val):
    self.__NAME=val #将所有的数据属性都隐藏起来

  @property
  def name(self):
    return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)

  @name.setter
  def name(self,value):
    if not isinstance(value,str): #在设定值之前进行类型检查
      raise TypeError('%s must be str' %value)
    self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME

  @name.deleter
  def name(self):
    raise TypeError('Can not delete')

f=Foo('egon')
print(f.name)
# f.name=10 #抛出异常'TypeError: 10 must be str'
del f.name #抛出异常'TypeError: Can not delete'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python通过解析网页实现看报程序的方法
Aug 04 Python
Python中使用异常处理来判断运行的操作系统平台方法
Jan 22 Python
python中字符串的操作方法大全
Jun 03 Python
python中的插值 scipy-interp的实现代码
Jul 23 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
Django框架自定义模型管理器与元选项用法分析
Jul 22 Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 Python
pytest中文文档之编写断言
Sep 12 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
Django实现将一个字典传到前端显示出来
Apr 03 Python
Python 实现自动登录+点击+滑动验证功能
Jun 10 Python
python利用proxybroker构建爬虫免费IP代理池的实现
Feb 21 Python
python GUI计算器的实现
Oct 09 #Python
Numpy实现卷积神经网络(CNN)的示例
Oct 09 #Python
Python使用socket_TCP实现小文件下载功能
Oct 09 #Python
python实现逻辑回归的示例
Oct 09 #Python
Django生成数据库及添加用户报错解决方案
Oct 09 #Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
Oct 09 #Python
python实现数据结构中双向循环链表操作的示例
Oct 09 #Python
You might like
PHP类继承 extends使用介绍
2014/01/14 PHP
PHP内置的Math函数效率测试
2014/12/01 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
动态加载js、css的实例代码
2016/05/26 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
用jquery快速解决IE输入框不能输入的问题
2016/10/04 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
ajax接收后台数据在html页面显示
2017/02/19 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
浅析js实现网页截图的两种方式
2019/11/01 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python中的元类编程入门指引
2015/04/15 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
使用Python设计一个代码统计工具
2018/04/04 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
人力资源主管的岗位职责
2014/03/15 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
助残日活动总结
2014/08/27 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
奔腾年代观后感
2015/06/09 职场文书
详解Python中的for循环
2022/04/30 Python