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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
Python信息抽取之乱码解决办法
Jun 29 Python
Python+Django搭建自己的blog网站
Mar 13 Python
Django 大文件下载实现过程解析
Aug 01 Python
Python 经典算法100及解析(小结)
Sep 13 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
python爬虫添加请求头代码实例
Dec 28 Python
python实现处理mysql结果输出方式
Apr 09 Python
python 如何上传包到pypi
Dec 24 Python
在python中实现导入一个需要传参的模块
May 12 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 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 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
ext for eclipse插件安装方法
2008/04/27 Javascript
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
jQuery随机密码生成的方法
2015/03/09 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python中readline判断文件读取结束的方法
2014/11/08 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
python and or用法详解
2019/06/26 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
开学典礼主持词
2014/03/19 职场文书
遗产继承公证书
2014/04/09 职场文书
省委召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
2014年话务员工作总结
2014/11/19 职场文书
个人汇报材料范文
2014/12/30 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
情况说明书格式及范文
2019/06/24 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技