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的Django框架中自定义模版标签的示例
Jul 20 Python
在win和Linux系统中python命令行运行的不同
Jul 03 Python
人机交互程序 python实现人机对话
Nov 14 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
python实现超市扫码仪计费
May 30 Python
浅谈Python中的bs4基础
Oct 21 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
Python数据持久化存储实现方法分析
Dec 21 Python
关于Keras模型可视化教程及关键问题的解决
Jan 24 Python
Python 去除字符串中指定字符串
Mar 05 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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微信开发用Cache 解决数据缓存
2016/07/11 PHP
php利用递归实现删除文件目录的方法
2016/09/23 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
jquery入门—访问DOM对象方法
2013/01/07 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
基于cookie实现zTree树刷新后展开状态不变
2017/02/28 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
Python中random模块用法实例分析
2015/05/19 Python
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
python实现反转部分单向链表
2018/09/27 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
python画双y轴图像的示例代码
2019/07/07 Python
python @classmethod 的使用场合详解
2019/08/23 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
利用python生成照片墙的示例代码
2020/04/09 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
英国办公用品商店:Office Outlet
2018/04/04 全球购物
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
别名指示符是什么
2012/10/08 面试题
《记承天寺夜游》教学反思
2014/02/16 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
失职检讨书大全
2015/01/26 职场文书
会计工作岗位职责
2015/02/03 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
四年级作文之说明文作文
2019/10/14 职场文书