本文我们介绍如何定义 Python 只读属性,以及使用只读属性定义计算属性。

只读属性简介

定义只读属性的方法就是创建只有 getter 方法的属性。不过,这种方法定义的不是真正意义上的只读属性,因为我们总是可以访问和修改底层的属性。

只读属性通常用于某些特定场景,例如定义计算属性。

以下示例定义了一个类 Circle,包含 radius 属性和 area() 方法:

import mathclass Circle:def __init__(self, radius):self.radius = radiusdef area(self):return math.pi * self.radius ** 2

下面的代码创建了一个新的 Circle 对象,并且返回了它的面积:

c = Circle(10)
print(c.area())

输出结果如下:

314.1592653589793

以上代码可以正常运行。但是,如果 area 是 Circle 对象的一个属性,而不是方法的话,会更加符合我们的常识。为了将 area() 方法修改为属性,可以使用 @property 装饰器:

import mathclass Circle:def __init__(self, radius):self.radius = radius@propertydef area(self):return math.pi * self.radius ** 2c = Circle(10)
print(c.area)

area 基于 radius 属性的计算结果,因此通常被称为计算属性。

缓存计算属性

假如我们创建了一个新的 Circle 对象,并且多次访问 area 属性。每次访问时,都需要重新计算面积,这种方式不够高效。

为了提高性能,我们只需要在半径发生变化时重新计算圆的面积。如果半径没有改变,我们可以重用之前的面积。为此,我们可以使用以下缓存技术:

  • 首先,计算面积并将其缓存。
  • 然后,当半径发生改变时重新计算面积;否则直接从缓存中返回面积。

以下代码重新定义了 Circle 类,对 area 属性进行了缓存处理:

import mathclass Circle:def __init__(self, radius):self._radius = radiusself._area = None@propertydef radius(self):return self._radius@radius.setterdef radius(self, value):if value < 0:raise ValueError('Radius must be positive')if value != self._radius:self._radius = valueself._area = None@propertydef area(self):if self._area is None:self._area = math.pi * self.radius ** 2return self._area

首先,在 __init__ 方法中将 _area 设置为 None。_area 属性就是存储面积的缓存。

其次,如果半径发生变化(通过 setter 方法),将 _area 重置为 None。

最后,定义计算属性 area。如果 _area 不为 None,返回它的值;否则,计算面积并将其保存到 _area,返回数据。

总结

  • 通过只定义 getter 方法的方式创建只读属性。
  • 使用计算属性创建更加自然的类属性。
  • 使用缓存改进计算属性的性能。

【Python面向对象编程】第19篇 只读属性相关推荐

  1. [转载] Python面向对象编程系列第一篇

    参考链接: Python中的面向对象编程1(类,对象和成员) 一.类和对象 1.什么是类: 类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据的操作封装在一起,类是抽象的.类只负责描 ...

  2. python编程基础是什么-Python面向对象编程基础解析(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的.应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元. 2.面向 ...

  3. python面向对象编程的语言_怎么使用python面向对象编程

    怎么使用python面向对象编程 发布时间:2020-08-25 13:42:19 来源:亿速云 阅读:89 作者:Leah 本篇文章给大家分享的是有关怎么使用python面向对象编程,小编觉得挺实用 ...

  4. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  5. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  6. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

  7. 【Python基础】Python 面向对象编程(上篇)

    我的施工计划图 已完成专题包括: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 7函数使用专题 今天是面向对象编程的上篇:基础专题 Python 面向对象编程 ...

  8. Python 面向对象编程基础

    Python面向对象编程 简介:面向对象编程--Object Oriented Programming,简称 OOP,是一种程序设计思想.OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据 ...

  9. (转)Python 面向对象编程(一)

    Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程.下面就来了解一下如何在Python中进行对象编程. 一.如何定义一个类 在进行python面向对象 ...

  10. Python零基础速成班-第10讲-Python面向对象编程(下),Property属性、特殊方法、设计模式、链表应用

    Python零基础速成班-第10讲-Python面向对象编程(下),Property属性.特殊方法.设计模式.链表应用 学习目标 面向对象编程 接上一讲:Property属性.特殊方法.设计模式 面向 ...

最新文章

  1. Science新研究颠覆认知,有望一举解决困扰器官移植60余年问题,网友:生物课本得改了...
  2. console.log 如何打印对象
  3. 一场由nginx优化引起的tcp/ip及tcpdump研究
  4. android adt 最新下载地址
  5. Ext.js4.x 的面板中嵌入UEditor编辑器
  6. php写linux应用程序,Linux应用程序使用写文件调试程序的方法
  7. 区块链企业级解决方案 ( Hyperledger )
  8. 神清气爽,小妹妹,先给她示范了一遍红色警戒
  9. java varargs_Java中方法重载中的Varargs
  10. 耳目一新的在线答疑服务背后的核心技术
  11. Spring Quartz 框架结构概述(一)[转]
  12. 学c语言前要了解什么软件,学习c语言需要什么软件?
  13. 5G时代,企业逐渐走向无纸化办公,你习惯了吗?
  14. U盘写保护、不可访问、无法格式化问题的解决办法
  15. java:线程的六种状态
  16. Oracle11g的安装及删除
  17. d3js绘制y坐标轴_如何用D3绘制各类样式的x坐标轴
  18. c++一元三次方程求解(NOIP2001 提高组)
  19. 回归预测 | MATLAB实现SSA-BP多输入单输出回归预测
  20. 小草小草快点长大。。

热门文章

  1. 次氯酸钠phP,次氯酸钠
  2. 征途LINUX服务端脚本技术,腾讯征途手游脚本 辅助基本语法
  3. Tox:你想知道的内容
  4. java后端必会【基础知识点】
  5. HY-SRF05超声波测距
  6. 八卦一下 ,拉点流量
  7. 使用U盘在虚拟机中安装系统
  8. python去除重复单词_Python重复的单词
  9. 程序员常用单词词汇汇总
  10. amd显卡风扇调节_amd显卡风扇速度设置linux版本