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实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
Python进行数据科学工作的简单入门教程
Apr 01 Python
Python六大开源框架对比
Oct 19 Python
Python生成随机验证码的两种方法
Dec 22 Python
python中的格式化输出用法总结
Jul 28 Python
python将ansible配置转为json格式实例代码
May 15 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
解决python 读取 log日志的编码问题
Dec 24 Python
python数据分析:关键字提取方式
Feb 24 Python
Python通过Pillow实现图片对比
Apr 29 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 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 5.0 Pear安装方法
2006/12/06 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
jquery 笔记 事件
2011/11/02 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python循环语句之break与continue的用法
2015/10/14 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
django_orm查询性能优化方法
2018/08/20 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
Marks & Spencer爱尔兰:英国马莎百货
2016/04/20 全球购物
淘宝好评语大全
2014/05/05 职场文书
学籍证明模板
2015/06/18 职场文书
Django 实现jwt认证的示例
2021/04/30 Python