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函数的参数的默认值所引发的问题的原因
Mar 30 Python
python音频处理用到的操作的示例代码
Oct 27 Python
django rest framework之请求与响应(详解)
Nov 06 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
Apr 18 Python
Python实现的读取/更改/写入xml文件操作示例
Aug 30 Python
Python实现深度遍历和广度遍历的方法
Jan 22 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
Aug 27 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
python 实现两个变量值进行交换的n种操作
Jun 02 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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面向对象全攻略 (十四) php5接口技术
2009/09/30 PHP
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
PHP垃圾回收机制简单说明
2010/07/22 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
asp 的 分词实现代码
2007/05/24 Javascript
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
CCPry JS类库 代码
2009/10/30 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
vue.js表格分页示例
2016/10/18 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
Python3里的super()和__class__使用介绍
2015/04/23 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
Python银行系统实战源码
2019/10/25 Python
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
六一儿童节主持词
2014/03/21 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
民主评议党员工作总结
2014/10/20 职场文书
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript