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 相关文章推荐
pyramid配置session的方法教程
Nov 27 Python
python结合API实现即时天气信息
Jan 19 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
tensorflow获取变量维度信息
Mar 10 Python
使用matplotlib画散点图的方法
May 25 Python
python ddt数据驱动最简实例代码
Feb 22 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
基于python3实现倒叙字符串
Feb 18 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
Jan 24 Python
python数字图像处理:图像简单滤波
Jun 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
php网站判断用户是否是手机访问的方法
2013/11/01 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
jquer之ajaxQueue简单实现代码
2011/09/15 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
Node.js学习入门
2017/01/03 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
vue ssr+koa2构建服务端渲染的示例代码
2020/03/23 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
Python for循环生成列表的实例
2018/06/15 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
python函数定义和调用过程详解
2020/02/09 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
Python进程的通信Queue、Pipe实例分析
2020/03/30 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
纯CSS3实现圆圈动态发光特效动画的示例代码
2021/03/08 HTML / CSS
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
什么是GWT的Entry Point
2013/08/16 面试题
毕业生找工作的自我评价
2013/10/18 职场文书
幸福家庭标语
2014/06/27 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
Golang的继承模拟实例
2021/06/30 Golang