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数据结构之二叉树的建立实例
Apr 29 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
Django实现登录随机验证码的示例代码
Jun 20 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
python+splinter自动刷新抢票功能
Sep 25 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
tensorflow 限制显存大小的实现
Feb 03 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
Jun 28 Python
PyQt5爬取12306车票信息程序的实现
May 14 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
下载文件的点击数回填
2006/10/09 PHP
PHP修改session_id示例代码
2014/01/08 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
js图片处理示例代码
2014/05/12 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
详解vue跨组件通信的几种方法
2017/06/15 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
react实现菜单权限控制的方法
2017/12/11 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
[01:46]新英雄登场
2019/09/10 DOTA
python连接池实现示例程序
2013/11/26 Python
Python中正则表达式详解
2017/05/17 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
python安装gdal的两种方法
2019/10/29 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
什么是Rollback Segment
2013/04/22 面试题
小区门卫岗位职责
2013/12/31 职场文书
高中体育教学反思
2014/01/29 职场文书
市场营销管理制度
2014/01/29 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
承诺书怎么写
2014/03/26 职场文书
电子商务实训报告总结
2014/11/05 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书