Python 从入门到实战23(属性property)

        我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。

上篇文章我们讨论了类的定义、使用方法的相关知识。今天我们将学习一下类的属性(property)。

        本次要介绍的属性是一种特殊的属性,访问它时将计算它的值。另外,该属性还可以为属性添加安全包含机制。

1、创建用于计算的属性(@property)

在python中,可以通过@property(装饰器)将一个方法转换为属性,以实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,无需使用“()”。

使用语法:  @property

            def  methodname(self):

                                   block

参数说明:methodname-----指定方法名,一般小写字母开头,后面作为创建的属性名

          self  -----必要参数,表示类的实例

          block  ---方法体,实现的具体功能。通常以return 语句结束,返回计算结果

举例说明:

#计算长方形类,@property 方法转换为属性用于计算
class Rect_area:
    def __init__(self,long,width):
        self.long = long
        self.width = width
    @property
    def area(self):
        return self.long*self.width
rect1 = Rect_area(5,4)
print("长方形的面积:",rect1.area)

输出结果:20

注意:通过@property 修饰后不能重新赋值,如下会报错:

2、为属性添加保护机制(@property)

在python中,默认情况下,创建的属性或者实例是可以在类体外进行修改的。如果想要限制类体外不可修改。可以将它设置为私有,但将它设置为私有后,在类体外就无法获取它的值。若是想创建一个可以被读取,但不可以被修改的属性,可以使用@property 实现只读属性。

1)设置只读属性

举例说明:

#播放音乐的例子
class MusicPlay:
    def __init__(self,play):
        self.__play = play  #加双下划线表示私有类型属性
    @property
    def play(self):
        return self.__play #返回私有属性的值
musicPlay = MusicPlay("正在播放《青花瓷》")
print("默认:",musicPlay.play)   #获取属性值
musicPlay.play = "正在播放《知心爱人》"

输出结果:

可以看到最后一行编码报错,修改只读属性时报错。

2)只读属性设置setter方法修改

另外,参考上面报错的提示,若想修改,可以设置setter 方法让属性可以修改,

参考例子:

#播放音乐的例子

class MusicPlay:
    music_list=["青花瓷","知心爱人","忘情水"]

    def __init__(self,play):
        self.__play = play  #加双下划线表示私有类型属性
    @property
    def play(self):
        return self.__play #返回私有属性的值
    @play.setter
    def play(self,value):
        if value in MusicPlay.music_list:
            self.__play = "你选择了《"+value+"》,稍后播放"
        else:
            self.__play = "你选择的歌曲不存在"

musicPlay = MusicPlay("青花瓷")
print("正在播放:《",musicPlay.play,"》")   #获取属性值,其中,就是连接字符串
print("你可以从",musicPlay.music_list,"中选择要听的音乐")
musicPlay.play = "忘情水"  #修改属性值
print(musicPlay.play)     #获取修改后的属性值

输出结果参考:

3、删除属性的deleter方法

  和setter 方法类似,当我们需要删除一个属性时,我们会使用deleter 方法。

#播放音乐的例子(黄色阴影部分为删除属性相关操作)
class MusicPlay:
    music_list=["青花瓷","知心爱人","忘情水"]

    def __init__(self,play):
        self.__play = play  #加双下划线表示私有类型属性
    @property
    def play(self):
        return self.__play #返回私有属性的值
    @play.setter
    def play(self,value):
        if value in MusicPlay.music_list:
            self.__play = "你选择了《"+value+"》,稍后播放"
        else:
            self.__play = "你选择的歌曲不存在"
    @play.deleter
    def play(self):
        self.__play =None


musicPlay = MusicPlay("青花瓷")
print("正在播放:《",musicPlay.play,"》")   #获取属性值,其中,就是连接字符串
print("你可以从",musicPlay.music_list,"中选择要听的音乐")
musicPlay.play = "忘情水"  #修改属性值
print(musicPlay.play)     #获取修改后的属性值
del musicPlay.play
print(musicPlay.play)
  #再次获取删除后的属性值:None

输出结果参考:

今天先写学习到这里了,每天进步一点点。明天也要加油啊!

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

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

相关文章

信息安全数学基础(19)同余式的基本概念及一次同余式

一、同余式概念 同余式是数论中的一个基本概念,用于描述两个数在除以某个数时所得的余数相同的情况。具体地,设m是一个正整数,a和b是两个整数,如果a和b除以m的余数相同,则称a和b模m同余,记作a≡b(mod m)。反…

【有啥问啥】OpenAI o1的思考之前训练扩展定律、后训练扩展定律与推理扩展定律:原理与应用详解

OpenAI o1的思考之前训练扩展定律、后训练扩展定律与推理扩展定律:原理与应用详解 随着深度学习技术的不断发展,模型的规模和复杂度也迅速提升。研究人员发现了模型训练和推理过程中性能变化的规律,这些规律为我们提供了优化模型设计与训练的…

基于微信小程序的剧本杀游玩一体化平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的剧…

PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边框特效项目

项目地址: GitHub - github201014/PyQt-NativeWindow: A class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypesA class of window include nativeEvent, use PySide or PyQt and Pywin32 and ctypes - github201014/PyQt-NativeWindow…

Pix2Pix——图像转换(图像到图像),通过输入的一种图像生成目标图像

Pix2Pix 是一种基于**条件生成对抗网络(Conditional GANs)**的图像转换模型,旨在将一种图像转换为另一种图像,适用于图像到图像(Image-to-Image)转换任务。它可以通过输入的一种图像生成目标图像&#xff0…

MyBatis 分批次执行(新增,修改,删除)

import com.google.common.collect.Lists;import java.util.Iterator; import java.util.List; import java.util.function.Consumer;/*** Description mybatis分批插入数据使用* Author WangKun* Date 2024/9/19 11:20* Version*/ public class MyBatisSqlUtils {/*** param d…

4G 网络下资源加载失败?一次运营商封禁 IP 的案例分享

在工作中,网络问题是不可避免的挑战之一。最近,我们在项目中遇到了一起网络资源加载异常的问题:某同事在使用 4G 网络连接公司 VPN 时,云服务的前端资源居然无法加载!通过一系列的排查和分析,我们发现问题的…

SQL案例分析:计算延迟法定退休年龄

2024年9月13日第十四届全国人民代表大会常务委员会第十一次会议通过了《关于实施渐进式延迟法定退休年龄的决定》。 从2025年1月1日起,男职工和原法定退休年龄为五十五周岁的女职工,法定退休年龄每四个月延迟一个月,分别逐步延迟至六十三周岁…

DataFrame生成excel后为什么多了一行数字

问题描述 python查询数据生成excel文件,生成的excel多了第一行数字索引,1,2,3,4,5...... 代码: df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决: 原理也很简单,就是设置个参…

Shell脚本弹奏中文版“生日快乐歌”

在《Shell命令控制蜂鸣器发声》一文中,我们了解到了如何在Ubuntu下安装beep命令来控制PC主板上蜂鸣器发声,这次我们想让蜂鸣器弹奏出中文版的“生日快乐歌”,首先还是要用sudo modprobe pcspkr命令加载驱动,然后在Shell脚本所在目…

深入浅出通信原理

深入浅出通信原理 文章目录 深入浅出通信原理前言一、概述二、信号和频谱2.1 信号2.2 信号的分解与合成2.3 傅里叶变换的特性2.4 离散傅里叶变化 三 信道3.1 衰减和损耗3.2 多普勒效应 四 信源编码4.1 采样4.2 量化4.3 编码 五 基带信号的发送和接受5.1 脉冲成形5.2 眼图 六 频…

我的demo保卫萝卜中的技术要点

管理类: GameManager(单例),GameController(单例); 一些其他的管理类(PlayerManager,AudioSourceManager,FactoryManager)作为GameManager的成员变量存在(这样也可以保证只有一个存…

高德地图JS API AMap.MouseTool绘制

fang 🤖 作者简介:水煮白菜王 ,一位资深前端劝退师 👻 👀 文章专栏: 高德AMap专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧✍。 感谢支持💕💕&#…

24.9.2-24.9.20第一次周总结

小升初了,以后每周发一次周总结。 语文 1. 写完了写字本 2. 预习完了语文课本 作文积累: 丁香结课文可写所有题目,写景写人写物都可以套用。 写景是为了抒情,没有纯写景的作文。 数学 《奥数》做到了第三周第四页&#xf…

本地搭建我的世界服务器(JAVA)简单记录

网上参考教程挺多的,踩了不少坑,简单记录一下,我做的是一个私人服务器,就是和朋友3、4个人玩。 笨蛋 MC 开服教程 先放一个比较系统和完整的教程,萌新可用,这个教程很详细,我只是记录一下自己的…

【QT】定时器使用

文章目录 关于 Qt 定时器使用的注意细节总结实例-检查工具使用周期时间是否合理UI设计头文件 remind.h源文件 remind.cpp实现效果 关于 Qt 定时器使用的注意细节总结 一、创建与初始化 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象,确保定时器在正确的…

自动化测试常用函数

目录 一、元素的定位 1、cssSelector 2、xpath (1)xpath 语法 1、获取HTML页面所有的节点 2、获取HTML页面指定的节点 3、获取一个节点中的直接子节点 4、获取一个节点的父节点 5、实现节点属性的匹配 6、使用指定索引的方式获取对应的节点内容…

python中装饰器的作用

在Python中,装饰器(Decorator)是一种强大的工具,它允许你在不修改原有函数代码的情况下,给函数增加新的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数,这个新函数通常…

【鸿蒙】HarmonyOS NEXT星河入门到实战8-自定义组件-组件通信

目录 1、模块化语法 1.1 模块化基本认知 1.2 默认导出和导入 1.2.1 在ets下新建tools目录 1.2.2 在tools下新建moduls.ets文件 1.2.3 index.ets 1.3 按需导出和导入 1.4 全部导入 2、自定义组件 -基础 2.1 自定义组件 - 基本使用 2.2 自定义组件 -通用样式 2.2.1 et…

OceanBase中Range 分区 和 Range Columns 分区

1. Range 分区和 Range Columns 分区的区别 Range 分区:只允许基于一个整型列(INT 类型)的值范围进行分区。通常适用于那些可以自然用整数来表达的值,如商品编号、用户 ID 等。OceanBase 限定 Range 分区的分区键为 INT 类型&…