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基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 Python
python3爬取淘宝信息代码分析
Feb 10 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
Python实现的计算器功能示例
Apr 26 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
元组列表字典(莫烦python基础)
Apr 03 Python
python中几种自动微分库解析
Aug 29 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
Jan 08 Python
django中嵌套的try-except实例
May 21 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和ACCESS写聊天室(五)
2006/10/09 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
javascript常用的方法分享
2015/07/01 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
vue+node+webpack环境搭建教程
2017/11/05 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
vue中v-text / v-html使用实例代码详解
2019/04/02 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
python的id()函数介绍
2013/02/10 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
荣耀商城:HIHONOR
2020/11/03 全球购物
J2EE包括哪些技术
2016/11/25 面试题
项目建议书格式
2014/03/12 职场文书
创建文明城市标语
2014/06/16 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
关于召开会议的通知
2015/04/15 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript