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.xdnf.cn/news/146162.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

uboot:源码分析-启动第一阶段-start.S解析

start.S引入 进入start.S文件中,发现57行中就是_start标号的定义处 SourceInsight中添加行号 在SI中,如果我们知道我们要找的文件的名字,但是我们又不知道他在哪个目录下,我们要怎样找到并打开这个文件?方法是在SI中先…

教你快速制作一本3D翻页电子杂志

​在制作3D翻页电子杂志之前,我们需要了解一些基本概念。3D翻页电子杂志主要通过翻页效果来展示内容,读者可以通过手指滑动或点击鼠标来进行翻页。此外,它还支持图片、文字、视频等多种媒体形式的展示,为读者带来全方位的阅读体验…

KTH5774 —— 3D 摇杆/操纵杆霍尔位置传感器芯片

KTH5774 是一款摇杆、操纵杆专用的 3D 霍尔磁感 应芯片,主要面向对线性度和可靠性要求严格的应用 场景。 KTH5774 基于 3D 霍尔技术,内部分别集成了 X 轴、 Y 轴和 Z 轴三个独立的霍尔元件,能够通过测量和 处理磁通密度矢量的三个空间分量…

决策树算法中篇

手动计算实现决策树分类 数据整合 X[真实用户] y X 计算未划分信息熵 s X[真实用户] p s.value_counts()/s.size (p * np.log2(1/p)).sum() 按照日志密度进行划分 x X[日志密度].unique() x.sort() # 如何划分呢,分成两部分 for i in range(len(x) - 1):sp…

Checkstyle 使用总结

1. 使用 GitHub 地址:checkstyle/checkstyle: Checkstyle is a development tool to help programmers write Java code that adheres to a coding standard. 官网文档地址:checkstyle – Checkstyle 10.17.0 1.1 IDEA 插件 在 IDEA 搜索插件 CheckS…

DOS(Disk Operating System,磁盘操作系统)常用指令

目录 背景: 早期探索: DOS之父: 发展历程: 常用指令: 进入命令: 操作1.进入和回退: 操作2.增、删: 操作3.其它: 总结: 背景: 早期探索: DOS(Disk Operating System,磁盘操作系统)在…

基于云的补丁管理

什么是云补丁 云补丁或基于云的补丁管理是指扫描和检测缺失补丁、测试补丁并将它们部署到所需系统的过程,所有这些都通过基于云的控制台或软件完成。虽然补丁管理工作流程通常保持不变,但基于云的补丁管理的主要区别在于,整个过程仅通过基于…

数据跨境流通发展现状浅析

文章目录 前言一、数据跨境流通的场景二、数据跨境流通国内发展现状三、数据跨境流通国外发展现状1、国外的数据跨境政策类型:(1)美国以数据自由流动为核心(2)欧盟将人权保护作为首要考虑(3)俄罗…

2.1 SQL语言及如何创建数据表

一、什么是SQL语言 SQL语言全称叫做结构化查询语言,它是一种计算机语言,但是跟其他编程语言来比较还是有很大区别的。比如说HTML,CSS,Java script,这三种计算机语言是用在网页设计上面的。那么swift语言是用来开发IOS…

反转字符串中的单词--力扣151

反转字符串中的单词 题目思路代码 题目 思路 题目的难点在于首先要清除多余的空格,并且单词之间要留一个空格,首单词前和末尾单词后不能有多余空格。我们使用双指针去除所有的空格,然后在处理完一个单词后手动加一个单词。具体思路是当快指针…

k8s快速搭建+prometheus部署及使用(纯干货!!!)

目录 环境准备 1.所有主机安装docker 2.部署harbor 3.部署k8s 集群初始化 安装网络插件(此时选择的是flannel网络插件 后面也有calico网络插件的安装方法) 节点扩容 4.calico网络插件的部署(如果安装了flannel插件需要先删除&#xf…

web前端-HTML常用标签-综合案例

如图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document&…

LlamaIndex 中的 NodeParser

LlamaIndex 中 Document 会被转成 Node,Node 中的文字会进行 Embedding,最终保留向量数据做后续的搜索处理。这里的关键步骤是 Document 转为 Node 的策略,LlamaIndex 内置了多个 Document Reader 和 Node Parser,每个 NodeParser 都有自己的策略,需在初始化时进行设置。 …

基于springboot+vue超市管理系统

基于springbootvue超市管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本无人超市管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

STM32如何修改外部晶振频率和主频

对于STM32F10x系列的单片机&#xff0c;除了STM32F10x_CL单片机&#xff0c;其它的单片机一般外部晶振HSE的时钟频率都默认是8MHz。如果我们使用的外部晶振为12Mhz&#xff0c;那么可以把上图绿色标记改为:12000000 72MHz的主频8MHz的外部晶振HSE*倍频系数9。当然如果像上面把外…

四款好用的电脑录屏工具推荐!!

在科技日益发展的今天&#xff0c;屏幕录制已成为我们工作、学习和娱乐中不可或缺的一部分&#xff1b;无论是制作教程、记录游戏过程还是分享精彩瞬间&#xff0c;一个好的录屏工具都是不可或缺的&#xff1b;今天&#xff0c;我就为大家推荐四款实用又好用的电脑录屏工具&…

矿用立式负压自动排渣放水器感恩遇见

做良心产品一直是我们的初心好产品加上好服务&#xff0c;让您满意是我们一直的追求只凭低价去换取销量的话&#xff0c;就会想方设法降低成苯质量难有保障 矿用立式负压自动排渣放水器感恩遇见 概述 负压自动排渣放水器的型号为YCFP&#xff0c;YC指品牌永成&#xff0c;FP指…

mac os x 找不到钥匙串访问

昨天手贱更新了最新的mac系统&#xff0c;结果在实用工具中找不到钥匙串访问APP了。。。 最新mac系统为 15.0 (24A335) 真是醉了。。。 那就得想办法把他给呼出来&#xff0c;在开发者中心下载了一个.cer文件&#xff0c;然后双击打开&#xff0c;此时钥匙串打开了&#xff…

CSP-CCF★201912-2回收站选址★

一、问题描述 二、解答 代码&#xff1a; #include<iostream> #include<map> using namespace std; struct rubbish{int x;int y; }rub[1000]; int n; void input(){cin>>n;for(int i0;i<n;i){cin>>rub[i].x>>rub[i].y;} } bool has(int p,…

化繁为简:中介者模式如何管理复杂对象交互

化繁为简&#xff1a;中介者模式如何管理复杂对象交互 中介者模式 是一种行为型设计模式&#xff0c;定义了一个中介者对象&#xff0c;来封装一组对象之间的交互。中介者模式通过将对象之间的交互行为从多个对象中抽离出来&#xff0c;集中封装在一个中介者对象中&#xff0c;…