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实现带验证码网站的自动登陆实现代码
Jan 12 Python
Python中的localtime()方法使用详解
May 22 Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
python3实现字符串的全排列的方法(无重复字符)
Jul 07 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
wxPython实现文本框基础组件
Nov 18 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
django框架两个使用模板实例
Dec 11 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 Python
python数据分析之用sklearn预测糖尿病
Apr 22 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/04/10 PHP
PHP 文件扩展名 获取函数
2009/06/03 PHP
php开发中的页面跳转方法总结
2015/04/26 PHP
需要做特殊处理的DOM元素属性的访问
2010/11/05 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
python处理图片之PIL模块简单使用方法
2015/05/11 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
python pillow模块使用方法详解
2019/08/30 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
美容师的职业规划书
2013/12/27 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
学校关爱留守儿童活动方案
2014/08/27 职场文书
教师听课评语大全
2014/12/31 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
公司管理制度范本
2015/08/03 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL
MySQL系列之六 用户与授权
2021/07/02 MySQL
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript