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 14 Python
Python 多线程Threading初学教程
Aug 22 Python
python去掉空白行的多种实现代码
Mar 19 Python
解决python3中的requests解析中文页面出现乱码问题
Apr 19 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
keras .h5转移动端的.tflite文件实现方式
May 25 Python
Python3爬虫中Ajax的用法
Jul 10 Python
浅谈如何使用python抓取网页中的动态数据实现
Aug 17 Python
Python3 如何开启自带http服务
May 18 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
在项目中寻找代码的坏命名
2012/07/14 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
javascript实现微信分享
2014/12/23 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
Vue开发实现吸顶效果的示例代码
2018/08/21 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
微信小程序实现bindtap等事件传参
2019/04/08 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
JavaScript中的this/call/apply/bind的使用及区别
2020/03/06 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
Python使用Redis实现作业调度系统(超简单)
2016/03/22 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
大学自荐信
2013/12/12 职场文书
教师申诉制度
2014/01/29 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
授权委托书公证
2014/09/14 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript