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 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
Python3读取zip文件信息的方法
May 22 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
Python对多属性的重复数据去重实例
Apr 18 Python
python dataframe 输出结果整行显示的方法
Jun 14 Python
详解python中sort排序使用
Mar 23 Python
如何使用Python标准库进行性能测试
Jun 25 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
详解python中各种文件打开模式
Jan 19 Python
利用scikitlearn画ROC曲线实例
Jul 02 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 简单日历实现代码
2009/10/28 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
axios学习教程全攻略
2017/03/26 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
js中的 || 与 && 运算符详解
2018/05/24 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
2018/11/25 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
Node 模块原理与用法详解
2020/05/13 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
Python构建XML树结构的方法示例
2017/06/30 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
Python八皇后问题解答过程详解
2019/07/29 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
会议邀请函范文
2014/01/09 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
大课间体育活动方案
2014/03/12 职场文书
农村葬礼主持词
2014/03/31 职场文书
旅游文化节策划方案
2014/06/06 职场文书
员工加薪申请报告
2015/05/15 职场文书
调研报告的主要写法
2019/04/18 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL
Redis如何一键部署脚本
2021/04/12 Redis