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实现端口复用实例代码
Jul 03 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
Mar 02 Python
一篇文章快速了解Python的GIL
Jan 12 Python
python如何修改装饰器中参数
Mar 20 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
Java文件与类动手动脑实例详解
Nov 10 Python
python3获取控制台输入的数据的具体实例
Aug 16 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
Python入门之使用pandas分析excel数据
May 12 Python
python 多态 协议 鸭子类型详解
Nov 27 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
ZWILLING双立人英国网上商店:德国刀具锅具厨具品牌
2018/05/15 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
行政经理岗位职责
2013/11/09 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
2014年元旦感言
2014/03/06 职场文书
介绍信如何写
2015/01/31 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
带你了解Java中的ForkJoin
2022/04/28 Java/Android