Python property()函数:定义属性

news2024/9/29 4:05:17

我们一直在用“类对象.属性”的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。

因此,在不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个 getter(或 setter)方法,这样就可以通过“类对象.方法(参数)”的方式操作属性,例如:

class CLanguage:
#构造函数
def__init__(self,name):
        self.name = name 
#设置 name 属性值的函数 
defsetname(self,name):
        self.name = name
#访问nema属性值的函数
defgetname(self):
return self.name
#删除name属性值的函数
defdelname(self):
        self.name="xxx"
clang =CLanguage("CSDN社区")
#获取name属性值
print(clang.getname())
#设置name属性值
clang.setname("Python教程")
print(clang.getname())
#删除name属性值
clang.delname()
print(clang.getname())

运行结果为:

CSDN社区
Python教程
xxx

可能有读者觉得,这种操作类属性的方式比较麻烦,更习惯使用“类对象.属性”这种方式。

庆幸的是,Python 中提供了 property() 函数,可以实现在不破坏类封装原则的前提下,让开发者依旧使用“类对象.属性”的方式操作类中的属性。

property() 函数的基本使用格式如下:

属性名=property(fget=None, fset=None, fdel=None, doc=None)

其中,fget 参数用于指定获取该属性值的类方法,fset 参数用于指定设置该属性值的方法,fdel 参数用于指定删除该属性值的方法,最后的 doc 是一个文档字符串,用于说明此函数的作用。

注意,在使用 property() 函数时,以上 4 个参数可以仅指定第 1 个、或者前 2 个、或者前 3 个,当前也可以全部指定。也就是说,property() 函数中参数的指定并不是完全随意的。

例如,修改上面的程序,为 name 属性配置 property() 函数:

class CLanguage:
#构造函数
def__init__(self,n):
        self.__name = n
#设置 name 属性值的函数
defsetname(self,n):
        self.__name = n
#访问nema属性值的函数
defgetname(self):
return self.__name
#删除name属性值的函数
defdelname(self):
        self.__name="xxx"
#为name 属性配置 property() 函数
    name =property(getname, setname, delname,'指明出处')
#调取说明文档的 2 种方式
#print(CLanguage.name.__doc__)
help(CLanguage.name)
clang =CLanguage("CSDN社区")
#调用 getname() 方法
print(clang.name)
#调用 setname() 方法
clang.name="Python教程"
print(clang.name)
#调用 delname() 方法
del clang.name
print(clang.name)

运行结果为:

Help on property:

指明出处

CSDN社区
Python教程
xxx

注意,在此程序中,由于 getname() 方法中需要返回 name 属性,如果使用 self.name 的话,其本身又被调用 getname(),这将会先入无限死循环。为了避免这种情况的出现,程序中的 name 属性必须设置为私有属性,即使用 __name(前面有 2 个下划线)。

有关类属性和类方法的属性设置(分为共有属性、保护属性、私有属性),后续章节会做详细介绍。

当然,property() 函数也可以少传入几个参数。以上面的程序为例,我们可以修改 property() 函数如下所示

name =property(getname, setname)

这意味着,name 是一个可读写的属性,但不能删除,因为 property() 函数中并没有为 name 配置用于函数该属性的方法。也就是说,即便 CLanguage 类中设计有 delname() 函数,这种情况下也不能用来删除 name 属性。

同理,还可以像如下这样使用 property() 函数:

name =property(getname)# name 属性可读,不可写,也不能删除
name =property(getname, setname,delname)#name属性可读、可写、也可删除,就是没有说明文档

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

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

相关文章

AOP的四种增强方式

1. 前置增强,在核心功能之前执行的额外功能 public class MyBeforeAdvice implements MethodBeforeAdvice{Overridepublic void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {System.out.print("this is my before advice!");Str…

渲染函数render

文章目录节点、树以及虚拟 DOM树节点虚拟 DOMvue中render函数的作用render函数去创建子组件内容createElement官方文档参考节点、树以及虚拟 DOM 在深入渲染函数之前&#xff0c;了解一些浏览器的工作原理是很重要的。以下面这段 HTML 为例&#xff1a; <div><h1>…

user-select:none真的能禁止文本的复制粘贴吗?

1. 前言 面向搜索引擎开发时&#xff0c;我们经常看到这样的情况&#xff1a;登录后复制。 由于设置了css属性 user-select:none&#xff0c;此时鼠标无法实现选中文本&#xff0c;也就无法复制文本&#xff0c;通常会采用这种方式来禁止复制文本。打开开发者工具-审查元素&am…

k-means聚类

一、概述 当前人工智能技术实现的一种主要手段是机器学习&#xff0c;而机器学习能够解决的问题主要有三种&#xff1a;分类、聚类、回归&#xff0c;有监督的是分类&#xff0c;无监督的是聚类。所谓聚类&#xff0c;就是以一定的方法将一堆样本依它们本身的数据特性划分成不同…

docker安装mongdb

MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常松散&#xff0c;是类似json的bson格式&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非…

【操作系统】备忘录

进程上下文切换 用户态、内核态 内核态&#xff1a;也叫内核空间&#xff0c;是内核进程/线程所在的区域。主要负责运行系统、硬件交互。 用户态&#xff1a;也叫用户空间&#xff0c;是用户进程/线程所在的区域。主要用于执行用户程序。 内核态与用户态的区别 内核态与用户…

spring mvc文档阅读笔记——02

目录标题一、Asynchronous Requests&#xff08;异步请求&#xff09;&#xff08;一&#xff09;阻塞和非阻塞,同步和异步&#xff08;二&#xff09;DeferredResult&#xff08;三&#xff09;Callable二、跨域请求CORS&#xff08;一&#xff09;实现跨域请求的方式&#xf…

数据持久化-RDB-AOF

定义 将数据从掉电易失的内存放到永久储存的设备上 因为所有的数据都在内存是&#xff0c;所有必须得持久化 redis提供两种持久化方案 RDB默认开启、AOF RDB 1,保存真是的数据 2&#xff0c;将服务器包含的所有数据库数据以二进制文件形式保存到磁盘里面 3&#xff0c;默认…

JDBC管理事务

基本介绍 就是处理在mysql的事务 复习一下:事务是一组sql语句需要开启和提交&#xff0c;事务中的sql语句要么全部生效&#xff0c;要么全部不生效&#xff0c;提交之后就是全部生效&#xff0c;中间可以设置保存点&#xff0c;回退到保存点&#xff0c;或直接回退到最开始事务…

1.2.1存储结构:层次化存储结构、外存(辅存)、内存(主存)、CPU内部的寄存器、Cache(相联存储器)

1.2.1存储结构&#xff1a;层次化存储结构、外存&#xff08;辅存&#xff09;、内存&#xff08;主存&#xff09;、CPU内部的寄存器、Cache&#xff08;相联存储器&#xff09;存储系统--层次化存储结构外存&#xff08;辅存&#xff09;内存&#xff08;主存&#xff09;CPU…

并发编程学习(八):ReentrantLock

ReentrantLock 是java.util.concurrent.locks包下的类。相对于synchronized,它具备如下特性&#xff1a;可中断。可以设置超时时间。可以设置公平锁。支持多个条件变量。即可以有个多个waitset等待队列。与synchronized都支持可重入。ReentrantLock的基本语法&#xff1a;// 获…

数学建模相关竞赛零基础上手与入门介绍

文章目录1、赛事介绍与报名2、学习与训练2.1 比赛题目选择范围2.2 赛前组队与分工2.3 比赛时间分配1、赛事介绍与报名 什么是数学建模&#xff1f; 定义&#xff1a; 生活中的各种问题(如股票预测、火灾报警统计等)&#xff0c;运用数学的方式去阐述并解决它。 数学建模赛事 …

cisp证书含金量怎么样?值不值得考?

这是CISP考试报名条件参考&#xff1a; 成为CISP&#xff0c;必须满足以下基本要求&#xff1a; 申请CISE、CISO注册资质&#xff0c;需满足以下教育和工作经验要求&#xff1a; &#xff08;1&#xff09;教育和工作经历要求&#xff1a;硕士及硕士以上学历&#xff0c;具备…

LabVIEW在实时目标上使用文件路径

LabVIEW在实时目标上使用文件路径文件路径和结构因目标操作系统而异。本文档讨论了推荐的LabVIEW编码实践&#xff0c;用于指定文件路径&#xff0c;以便应用程序可以无缝地从目标移动目标。实时操作系统选项所有NI实时控制器运行三种不同的操作系统之一&#xff0c;即PharLap、…

Find My资讯|美国航班取消,出行者疯狂购买苹果AirTag追踪行李箱

美国西南航空&#xff08;Southwest Airlines Co.&#xff09;由于所使用的 SkySolver 系统在圣诞假期间崩溃&#xff0c;导致航班出现大面积延误或取消&#xff08;大约 13000 个航班受到影响&#xff09;&#xff0c;让公司损失超过 8 亿美元&#xff08;当前约 53.76 亿元人…

5.kafka--生产调优

文章目录Leader Partition负载均衡消费者初始化流程消费者再平衡生产者和消费者如何提高吞吐量如何发送大消息Leader Partition负载均衡 参数名称描述auto.leader.rebalance.enable默认是true。自动LeaderPartition平衡。生产环境中&#xff0c;leader重选举的代价比较大&…

ADB快速入门

ADB快速入门 一、 简介 Android Debug Bridge&#xff0c;我们一般简称为adb&#xff0c;主要存放在sdk安装目录下的platform-tools文件夹中&#xff0c;它是一个非常强大的命令行工具&#xff0c;通过这个工具用来连接电脑和Android设备&#xff08;手机、电脑、电视、平板、…

LIO-SAM代码解析——imuPreintegration.cpp

目录imuPreintegration.cpp1. TransformFusion 类1.1. lidarOdometryHandler1.2. imuOdometryHandler2. IMUPreintegration 类2.1. imuHandler2.2. odometryHandler⭐2.2.1. 初始化系统, 把初始的lidar位姿&#xff0c;速度&#xff0c;零偏加入到因子图中2.2.2. 将两帧之间的i…

【深度学习】简述CNN分类网络的演变脉络及各自的贡献与特点

问题 简述CNN分类网络的演变脉络及各自的贡献与特点 综述 深度学习的浪潮就是从CNN开始的,它结构形态的变化也见证着这门技术的发展。现在涌进来学习深度学习的大部分人都是做计算机视觉的,因为这个门槛相对较低,业界数据集开源了很多,也比较直观,而且对硬件设备的要求…

2023年二月份图形化四级打卡试题

活动时间 从2023年 1月1日至1月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; &#xff08;1&#xff09;小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 &#xff08;2&#xff09;小朋友做完题目后&…