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将xml和xsl转换为html的方法
Mar 10 Python
python基于multiprocessing的多进程创建方法
Jun 04 Python
Python性能提升之延迟初始化
Dec 04 Python
pycharm远程调试openstack的图文教程
Nov 21 Python
python实现统计文本中单词出现的频率详解
May 20 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
Aug 30 Python
Python基于Socket实现简单聊天室
Feb 17 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
jupyter notebook 重装教程
Apr 16 Python
记一次Django响应超慢的解决过程
Sep 17 Python
python re模块常见用法例举
Mar 01 Python
python flappy bird小游戏分步实现流程
Feb 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导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
Smarty变量用法详解
2016/05/11 PHP
详解php中空字符串和0之间的关系
2016/10/23 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
Async Validator 异步验证使用说明
2017/07/03 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
Python算法之栈(stack)的实现
2014/08/18 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
如何通过python实现全排列
2020/02/11 Python
Python Numpy中数据的常用保存与读取方法
2020/04/01 Python
在python3.9下如何安装scrapy的方法
2021/02/03 Python
澳大利亚礼品篮网站:Macarthur Baskets
2019/10/14 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
美国在线家具网站:GDFStudio
2021/03/13 全球购物
什么是makefile? 如何编写makefile?
2012/08/08 面试题
2014年出纳工作总结与计划
2014/12/09 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
大学生在校表现评语
2014/12/31 职场文书
跳高加油稿
2015/07/21 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL