6.4 特性(property)

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) #同上
'''
输出结果:
10
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'

最新文章

  1. File文件的使用
  2. Struts2注解使用说明
  3. jq实现点击弹出框代码
  4. Struts2系列——struts2的result
  5. asp.net页面刷新等问题
  6. AIDL跨进程通信
  7. HDU 3966 dfs序+LCA+树状数组
  8. .NET(C#):使用反射来获取枚举的名称、值和特性【转】
  9. ssis的script task作业失败(调用外部dll)
  10. 基于Python & Opencv 图像-视频-处理算法
  11. 对弈win32笔记
  12. PHP分帧后台模板页面css样式,js引入方法
  13. 软工实践第二次作业-sudoku
  14. linux每日命令(39):lsof命令
  15. django rest framework跨表取值
  16. cyclone IV中DDR的一个疑惑
  17. null和System.DBNull.Value的区别
  18. 用Android程序打开和关闭输入法
  19. csv到mysql数据库如何分割
  20. eclipse软件与git配合使用创建git仓库

热门文章

  1. BZOJ4881: [Lydsy1705月赛]线段游戏(二分图)
  2. 使用defined和require引入js
  3. C#拦截系统消息
  4. SSH学习之四 OpenSSH安全
  5. 利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏
  6. php str_replace替换特殊字符
  7. 【ZedGraph】右键菜单和鼠标滚轴的移动缩放等功能的启用和禁用 (转)
  8. docker基于commit命令创建支持ssh服务的镜像
  9. post参数的方法 json data 和特别的传参
  10. eclipse调试时增加jvm参数