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控制台显示时钟的示例
Feb 24 Python
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
浅析Python中将单词首字母大写的capitalize()方法
May 18 Python
简述Python2与Python3的不同点
Jan 21 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
Sep 04 Python
对Python3 序列解包详解
Feb 16 Python
Python os.access()用法实例
Feb 18 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
详解python datetime模块
Aug 17 Python
python3判断IP地址的方法
Mar 04 Python
pytorch锁死在dataloader(训练时卡死)
May 28 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
xml+php动态载入与分页
2006/10/09 PHP
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
Javascript - HTML的request类
2007/01/09 Javascript
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
使用jQuery.fn自定义jQuery翻页插件
2013/01/20 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
详解vuex的简单使用
2018/03/12 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
python pickle 和 shelve模块的用法
2013/09/16 Python
Python算法应用实战之栈详解
2017/02/04 Python
详解windows python3.7安装numpy问题的解决方法
2018/08/13 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
python 调试冷知识(小结)
2019/11/11 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
python 爬取小说并下载的示例
2020/12/07 Python
python中pdb模块实例用法
2021/01/15 Python
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
一年级语文教学反思
2014/02/13 职场文书
社区母亲节活动记录
2014/03/06 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
信访稳定工作汇报
2014/10/27 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
Python安装使用Scrapy框架
2022/04/12 Python