属性(property)

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

1  创建用于计算的属性

在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。

通过@property创建用于计算的属性的语法格式如下:

@property

def methodname(self):

    block

参数说明:

l  methodname:用于指定方法名,一般使用小写字母开头。该名称最后将作为创建的属性名。

l  self:必要参数,表示类的实例。

l  block:方法体,实现的具体功能。在方法体中,通常以return语句结束,用于返回计算结果。

例如,定义一个矩形类,在__init__()方法中定义两个实例属性,然后再定义一个计算矩形面积的方法,并应用@property将其转换为属性,最后创建类的实例,并访问转换后的属性,代码如下:

class Rect:

    def __init__(self,width,height):

        self.width = width                    # 矩形的宽

        self.height = height                  # 矩形的高

    @property                               # 将方法转换为属性

    def area(self):                         # 计算矩形的面积的方法

        return self.width*self.height      # 返回矩形的面积

rect = Rect(800,600)                        # 创建类的实例

print("面积为:",rect.area)                # 输出属性的值

运行上面的代码,将显示以下运行结果:

面积为: 480000

注意:通过@property转换后的属性不能重新赋值,如果对其重新赋值,将抛出如图14所示的异常信息。

图14  AttributeError异常

2  为属性添加安全保护机制

在Python中,默认情况下,创建的类属性或者实例是可以在类体外进行修改的,如果想要限制其不能在类体外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能直接通过实例名+属性名获取它的值。如果想要创建一个可以读取但不能修改的属性,那么可以使用@property实现只读属性。

例如,创建一个电视节目类TVshow,再创建一个show属性,用于显示当前播放的电视节目,代码如下:

class TVshow:   # 定义电视节目类

    def __init__(self,show):

        self.__show = show

    @property                            # 将方法转换为属性

    def show(self):                      # 定义show()方法

        return self.__show               # 返回私有属性的值

tvshow = TVshow("正在播放《战狼2》")          # 创建类的实例

print("默认:",tvshow.show)                # 获取属性值

执行上面的代码,将显示以下内容:

默认: 正在播放《战狼2》

通过上面的方法创建的show属性是只读的,尝试修改该属性的值,再重新获取。在上面代码中添加以下代码:

tvshow.show = "正在播放《红海行动》"        # 修改属性值

print("修改后:",tvshow.show)              # 获取属性值

运行后,将显示如图15所示的运行结果,其中红字的异常信息就是修改属性show时抛出的异常。

图15  修改只读属性时抛出的异常

通过属性不仅可以将属性设置为只读属性,而且可以为属性设置拦截器,即允许对属性进行修改,但修改时需要遵守一定的约束。

场景模拟:某电视台开设了电影点播功能,但要求只能从指定的几个电影(如《战狼2》《红海行动》《西游记女儿国》《熊出没・变形记》)中选择一个。

图标 (35)

  实例03  在模拟电影点播功能时应用属性

在IDLE中创建一个名称为film.py的文件,然后在该文件中定义一个电视节目类TVshow,并在该类中定义一个类属性,用于保存电影列表,然后在__init__()方法中定义一个私有的实例属性,再将该属性转换为可读取、可修改(有条件进行)的属性,最后创建类的实例,并获取和修改属性值,代码如下:

class TVshow:                                     # 定义电视节目类

    list_film = ["战狼2","红海行动","西游记女儿国","熊出没・变形记"]

    def __init__(self,show):

        self.__show = show

    @property                                     # 将方法转换为属性

    def show(self):                               # 定义show()方法

        return self.__show                       # 返回私有属性的值

    @show.setter                                  # 设置setter方法,让属性可修改

    def show(self,value):

        if value in TVshow.list_film:             # 判断值是否在列表中

            self.__show = "您选择了《" + value + "》,稍后将播放"  # 返回修改的值

        else:

            self.__show = "您点播的电影不存在"

tvshow = TVshow("战狼2")                          # 创建类的实例

print("正在播放:《",tvshow.show,"》")             # 获取属性值

print("您可以从",tvshow.list_film,"中选择要点播放的电影")

tvshow.show = "红海行动"                           # 修改属性值

print(tvshow.show)                                # 获取属性值

运行结果如图16所示。

图16  模拟电影点播功能

如果将第17行代码中的“红海行动”修改为“流浪地球”,将显示如图17所示的效果。

图17  要点播的电影不存在的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

几种更新 npm 项目依赖的实用方法

引言 在软件开发的过程中,我们知道依赖管理是其中一个至关重要的环节。npm(Node Package Manager) 是 Node.js 的包管理器,它主要用于 Node.js 项目的依赖管理和包发布。随着项目的不断发展,依赖库的版本更新和升级成…

基于Win11下的Wireshark的安装和使用

Wireshark的安装和使用 前言一、Wireshark是什么简介 二、下载Wireshark下载过程查看自己电脑配置 三、安装Wireshark安装过程安装组件创建快捷方式winPacpNpcap 打开检验 四、使用Wireshark实施抓包捕获数据包 五、基于Wireshark使用显示过滤器简介使用方法注意ICMP的请求和应…

目标检测算法综述

1 研究背景 1.1 概述 目标检测是计算机视觉的重要分支,主要任务是在给定的图片中精确找到物体所在位置,并标注出物体的类别,即包含了目标定位与目标分类两部分。在计算机视觉领域中的目标跟踪、图像分割、事件检测、场景理解等的任务都以目标…

Java线程几种常用方法详细说明

在Java编程中,多线程编程是一个非常重要的主题。它允许我们同时运行多个任务,提高程序的性能和响应速度。在这篇博客中,我们将介绍一些常用的Java线程方法和构造器,并通过示例代码展示如何使用它们。 Thread提供的常用方法 publi…

SpringBoot与Spring Framework提供的缓存抽象

目录 缓存 项目总结 新建一个SpringBoot项目 pom.xml application.properties CacheConfig Book BookRepository接口 BookService服务类 BookController控制器 SpringbootCacheApplication启动类 启动项目,使用Postman测试 参考博文: 1、使用…

llvm 3.5 源码分析 clang for x86 001 之搭环境

0,目标 编译 针对x86 的,debug 的 c语言的编译器 1,下载代码 git clone --recursive 。。。llvm-project.git $ cd llvm-project 2,预备代码 llvm 3.5 版本的源代码,早期版本,可能比较小比较容易debug $…

Unity MiniCPM-V 让引擎拥有视觉

Unity MiniCPM-V 让引擎拥有视觉 前言项目Python环境布置Unity场景布置代码编写添加并设置脚本总结 鸣谢AI提示 前言 新发布的MiniCPM-V,忍不住玩一下,可以让之前制作的语音助手拥有一定的视觉能力(不是OpenCV不行,而是AI更加符合…

深入理解Java关系运算符,避免常见错误!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

复现CELL文章图片,在线绘制scRNA-seq多个cluster的差异火山图

导读 火山图表示两组间的差异,而在scRNA-seq中,同时会有多个cluster(vs其他cluster)的差异。如果用常规火山图展示,可能需要绘制十几个图。有没有更高效的展示方法呢?今天给大家带来CELL文章“A Spatiotem…

打造SimPO新算法,微调8B模型超越Claude 3 Opus

前言 大型语言模型(LLM)近年来取得了巨大进展,但要将其与人类价值观和意图相一致,使其变得有用、诚实和无害,仍然是一个挑战。强化学习从人类反馈中(RLHF)是一种常用的方法,通过微调…

Charles的安装和web端抓包配置

1.Charles的安装 通过官网下载:https://www.charlesproxy.com/download/,我之前下载的是4.6.2版本,下载成功后点击安装包,点击下一步下一步即可安装成功。 ​​ ​ 安装成功后打开charles页面如下所示。 ​ 2.乱码问题解决 打开…

【C++】STL:栈和队列模拟实现

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

绘画参数配置及使用

绘画参数配置及使用 路径:站点后台-功能-AI绘画 进入参数配置 接口选择:多种接口自主选择(需自己准备key),对应接口的key对话和绘画通用 存储空间: 位置在超管后台-存储空间 自主选择存储(需…

【数据结构与算法】七大排序算法(下)

【数据结构与算法】七大排序算法(下) 🥕个人主页:开敲🍉 🔥所属专栏:数据结构与算法🍅 🌼文章目录🌼 2.3 交换排序 2.3.1 冒泡排序 2.3.2 快速排序 2.3.3 快速排序(非递归) 2.4 归并…

fpga入门 串口定时1秒发送1字节

一、 程序说明 FPGA通过串口定时发送数据,每秒发送1字节,数据不断自增 参考小梅哥教程 二、 uart_tx.v timescale 1ns / 1psmodule uart_tx(input wire sclk,input wire rst_n,output reg uart_tx);parameter …

【Python Cookbook】S01E12 根据字段将记录分组

目录 问题解决方案讨论 问题 如果有一系列的字典或对象实例,我们想根据某个特定的字段来分组迭代数据。 解决方案 假设有如下字典列表: rows [{address: 5412 N CLARK, date: 07/01/2012},{address: 5148 N CLARK, date: 07/04/2012},{address: 580…

W25Q64CV SPI Flash Memory

SPI简介 SPI是一种同步串行通信接口规范,用于短距离通信,主要应用于嵌入式系统。SPI通信由一个主设备和一个或多个从设备组成,其中主设备生成时钟信号并控制通信的开始和结束。 SPI通信的基本组成 四个基本信号 SCK (Serial Clock) - 时钟…

centos7下安装MySQL,Oracle数据库

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…

python数据分析——datetime数据类型2

参考资料:活用pandas库 # 导入pandas库 import pandas as pd # 加载数据集 teslapd.read_csv(r"...\data\tesla_stock_yahoo.csv") # 查看数据 print(tesla.head()) 1、基于日期取数据子集 # 将Date数据列转换为datetime类型 tesla[Date]pd.to_datetime…

学习笔记——网络参考模型——TCP/IP模型(传输层)

四、TCP/IP模型-传输层 一、TCP 1、TCP定义 TCP(Transmission Control Protocol,传输控制协议)∶为应用程序提供可靠的面向连接的通信服务。目前,许多流行的应用程序都使用TCP。 连接:正式发送数据之前,提前建立好一种虚拟的&…