属性(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 项目的依赖管理和包发布。随着项目的不断发展,依赖库的版本更新和升级成…

字符串-459重复字符串

459. 重复的子字符串 - 力扣(LeetCode) 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "ab…

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

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

【明道云】如何在发送邮件模块给出多条记录形成的列表

【背景】 在完成批量分别发送邮件给不同部门担当的任务后,作为主管部门的用户希望能够获得成功得到处理的所有记录信息。这些信息需要在提醒邮件中以表格形式呈现。 【分析】 获得多条记录的方法能够拿到数据,问题在于如何合适地以表格形式呈现在邮件中。 只有富文本支持表…

c++文件流

1.流的概念 在 C 中,流(stream)是一种用来处理输入输出数据的概念。 可以把流看作从源头(如文件、键盘、网络连接等)到终端的数据传输管道。 这些管道在程序运行时动态创建,并可以连接到多种不同的源头和…

目标检测算法综述

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

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

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

速盾:速盾高防cdn的防御原理?

速盾高防CDN是一种专业的网络安全解决方案,通过多种防御措施保护网站不受各种网络攻击的影响。其防御原理主要包括以下几个方面: 高强度DDoS防护 速盾高防CDN采用了弹性云防护集群,能够应对大规模的分布式拒绝服务(DDoS&#xff0…

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 $…

Python知识点1---变量和数据类型

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 在所有知识开始前,先给大家介绍一下Python的注释&#xf…

使用STM32和TB6600驱动器控制42BYGH步进电机

项目概述 1. 系统组成 STM32微控制器:作为主控制器,负责发出控制指令。TB6600驱动器:用于接收STM32的指令并驱动步进电机。42BYGH步进电机:作为执行元件,根据控制信号进行转动。电源:为STM32、TB6600和步…

Unity MiniCPM-V 让引擎拥有视觉

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

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

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

Java Web是前端吗:深入解析Java Web技术的定位与边界

Java Web是前端吗:深入解析Java Web技术的定位与边界 在探讨Java Web是否属于前端领域时,我们首先需要明确Java Web技术的定位和它所涉及的范畴。本文将从四个方面、五个方面、六个方面和七个方面来深入解析这一问题,带您领略Java Web技术的…

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

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

linux pigz 多线程压缩解压

压缩: tar --use-compress-programpigz -cvpf abc.tgz ./abc 解压: tar --use-compress-programpigz -xvf ./abc.tgz 解压到指定位置:tar --use-compress-programpigz -xvf ./abc.tgz -C ./hhh

原生js访问http获取数据的方法

在原生JavaScript中,直接通过浏览器端的JavaScript访问HTTP接口获取数据通常涉及XMLHttpRequest对象或现代的fetch API。 1. 使用XMLHttpRequest XMLHttpRequest是一个老旧的API,但在某些情况下仍然很有用。以下是一个简单的例子: javascr…

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

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

Charles的安装和web端抓包配置

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