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 08 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
May 29 Python
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
简单谈谈python中的Queue与多进程
Aug 25 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
python不换行之end=与逗号的意思及用途
Nov 21 Python
Python动态生成多维数组的方法示例
Aug 09 Python
解决python3中cv2读取中文路径的问题
Dec 05 Python
Django组件content-type使用方法详解
Jul 19 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
Python 文字识别
May 11 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
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP读取文件的常见几种方法
2016/11/03 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
详解bootstrap的modal-remote两种加载方式【强化】
2017/01/27 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
python操作mysql代码总结
2018/06/01 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
python写一个随机点名软件的实例
2019/11/28 Python
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
酒店执行总经理岗位职责
2013/12/15 职场文书
自主实习接收函
2014/01/13 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书