23、Python之面向对象:实例属性、类属性,傻傻分不清楚

引言

在上一篇文章中,我们初步介绍了Python面向对象中类定义的语法,顺带介绍了关于面向对象的系统工程中,所涉及的OOA与OOD。

其实,简单来说,类的定义其实就是面向对象的“封装”特性的体现。我们将分析、设计得到的实体的属性和方法,通过类的定义封装在一起,从而实现了代码模块的“高内聚”的特性。

相较于方法,属性的定义似乎要简单一些。但是,即便是简单的属性,稍不留意,可能也会触发意料之外的错误。所以,今天这篇文章,我们来稍微理一下类定义中属性的使用。

类属性与实例属性

一个简单的区分,看是在类中直接定义,还是在类的__init__方法中定义。

在Python类的定义中,直接在类中定义的变量,被称为类属性。因为Python中一切皆对象,类本身也是一个对象,类属性,其实就是类对象的属性。

在__init__方法中进行定义、初始化的属性,为对象属性。对象的属性是属于每个实例化的对象的,每个对象的实例属性都是各自独立存储的。

还以打工人的类定义进行举例说明:

class DaGongRen:
# 类属性,打工人计数
num = 0def __init__(self, no, name):
# 实例属性
self.no = no
self.name = name
DaGongRen.num += 1def work(self):
print(f"工号{self.no}的打工人【{self.name}】在努力工作")

属性的访问

关于属性的访问,先说几条简单的规则:

1、对象属性的访问,可以直接通过对象名.属性名的方式进行访问。

2、类属性的访问,可以通过对象名.属性名的方式,也可以通过类名.属性名的方式访问。

3、如果出现同名属性,访问时会按照属性查找的既定顺序进行同名覆盖。关于既定顺序,暂时可以理解为就近原则,在后面的方法查找路径中会进行进一步讲解。实例属性是可以通过继承存储到子类的对象实例中的,类属性是按照查找路径可以访问的。

4、Python中允许在对象的使用过程中动态添加新的属性,这个对象既包括实例对象也包括类对象,也就是说,类属性和实例属性都是可以动态添加的,虽然不建议这样做。

5、属性的修改会使规则变得复杂一些,简化来说,虽然实例对象能够访问到类对象中的类属性,但是,仅限于读操作。实例对象不能修改类对象中的类属性,当尝试进行这样操作时,会发现出发了第4条规则,实际的执行结果是在实例对象中添加了一个与类属性同名的实例属性。

以实际的代码为例:

# 通过类名访问类属性
print(DaGongRen.num)
zs = DaGongRen(11, 'zhangsan')
# 通过类名访问类属性
print(DaGongRen.num)
# 通过对象名访问类属性
print(zs.num)
# 看似修改类属性,实际是在对象中动态添加同名的属性,在对象实例中存储
zs.num = 100
# 访问的是对象的实例属性
print(zs.num)
# 访问的是类的类属性
print(DaGongRen.num)# 动态添加类属性
DaGongRen.abc = 123
print(DaGongRen.abc)
# 对象名访问新增的类属性
print(zs.abc)

执行结果:

1ea8035c6bb4553ef975e97cc2d09a83.jpeg

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

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

相关文章

BLE自适应跳频算法详解

前言 (1)自适应跳频算法是相当的简单,小学生都能够看懂,而且网上已经有相当多的关于自适应跳频算法的介绍。既然如此,为什么我还要写这样一篇博客呢? (2)原因很简单,我发…

内网横向——利用WMI进行内网横向

文章目录 一、WMI介绍二、常规利用方法三、常见利用工具3.1 wmiexec3.2 Invoke-WmiCommand 四、WMI事件订阅的利用4.1 手动实现4.2 Sharp-WMIEvent 网络拓扑: 攻击机kali IP:192.168.111.0 跳板机win7 IP:192.168.111.128,192.168…

业务记录:处理动态表头的CSV/EXCEL文件

业务描述:传入一个动态表头的CSV文件,解析CSV,并保存入库。 CSV文件的表头是不确定的,即顺序和字段个数不确定,以及表头是中文字段。 例如: 为了顺利解析CSV文件,前端需要传入对应的字段名和顺…

axure制作切换栏--动态面板的应用

先看下效果:点击上面的切换栏 切换到西游记栏目: 切换到水浒传栏目: 上述两个图片比对可以发现,在点击切换栏的时候,里面的内容以及切换栏的下面蓝色横线也会发生对应的变化。这里涉及到两个地方的变化,就…

Golang 知识结构图

总结Go的入门知识结构,如下图所示:

图形/视图结构的三个坐标系

图形/视图结构的三个坐标系分别为视图结构系物理结构系,场景坐标系,图形项坐标系。 本文记录实践三个坐标系及视图与场景坐标转换,通过事件槽来显示出来的过程。 自定义1个View视图组件,其中扩展了鼠标点击、鼠标移动的事件&…

Golang | Leetcode Golang题解之第297题二叉树的序列化与反序列化

题目: 题解: type Codec struct{}func Constructor() (_ Codec) {return }func (c Codec) serialize(root *TreeNode) string {if root nil {return "X"}left : "(" c.serialize(root.Left) ")"right : "("…

前端渲染模式

渲染的概念 在Web开发中,渲染(Rendering)是一个核心概念,指的是将应用程序的数据(data)与模板(template)结合,生成最终的HTML页面,这个页面随后会被浏览器解析…

主宰生物进化的 “魔咒” —— 制约生物在特殊环境下进化方式的线索

一些神秘的法则制约着生物在特殊环境下的进化方式。它们还为动物将如何适应气候变暖提供了线索。 一些奇特的进化现象 一艘装满大象和老鼠的 “诺亚方舟” 搁浅在一座偏远的小岛上。动物们都幸存下来并繁衍后代。但是,随着世代相传,奇怪的事情发生了&a…

【基础篇】Docker 概览 ONE

嗨,大家好!我是小竹笋,一名热爱创作的工程师。今天我将带领大家一起踏上探索 Docker 的奇妙之旅。我们先从 Docker 的历史和发展说起,然后再看看 Docker 和虚拟机之间的区别,最后了解一下 Docker 在各行各业的应用情况…

环境配置—批量删除时提示/usr/bin/rm: Argument list too long问题

文章目录 1. 背景介绍2. 问题原因3. 解决方案3.1 分批删除文件3.2 使用 find 命令直接删除3.3 增加系统参数限制3.4 使用循环删除 4. 结论 1. 背景介绍 在Linux系统中,rm 命令是删除文件和目录的常用工具。然而,当需要删除大量文件时,可能会…

【论文10】复现代码tips

一、准备工作 1.创建一个虚拟环境 conda create --name drgcnn38 python=3.8.18 2.激活虚拟环境 conda activate drgcnn38 注意事项 在Pycharm中终端(terminal)显示PS而不是虚拟环境base 问题如下所示 解决方法:shell路径改成cmd.exe 重启终端显示虚拟环境 3.安装torch …

Kafka知识总结(事务+数据存储+请求模型+常见场景)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 事务 事务Producer保证消息写入分区的原子性,即这批消…

国内本地化OCSP服务的SSL证书:提升安全与效率的新选择

在数字化时代,网络安全成为企业运营和用户体验的重要基石。HTTPS(Hypertext Transfer Protocol Secure)作为一种安全的网络协议,通过SSL(Secure Sockets Layer)加密技术,保障了数据传输的机密性…

MATLAB基础应用精讲-【数模应用】Poisson 回归分析(附R语言代码实现)

目录 前言 知识储备 基于泊松回归、负二项回归模型 数据分布介绍 模型介绍 模型的选择 案例介绍 算法原理 泊松回归 数学模型 适用条件 参数估计与假设检验 SPSSAU Poisson 回归案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解…

OpenSSL SSL_connect: Connection was reset in connection to github.com:443

OpenSSL SSL_connect: Connection was reset in connection to github.com:443 目录 OpenSSL SSL_connect: Connection was reset in connection to github.com:443 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&…

kuberneter管理GUI工具Lens

从github上可以知道,lens的前端是用electron做的客户端工具,打开安装路径你会发现kubectl.exe,没错,就是你经常用的kubectl命令行的客户端工具。kubectl本来就能输出json的数据类型,集成前端更方便了。看到这里你是不是发现&#…

前端Long类型精度丢失:后端处理策略

文章目录 精度丢失的具体原因解决方法1. 使用 JsonSerialize 和 ToStringSerializer2. 使用 JsonFormat 注解3. 全局配置解决方案 结论 开发商城管理系统的品牌管理界面时,发现一个问题,接口返回品牌Id和页面展示的品牌Id不一致,如接口返回的…

Transformer--输入部分

🏷️上文我们简单介绍了Transformer模型的总体架构,本章我们主要介绍其输入部分 📖前言 📖文本嵌入层的作用 📖位置编码器的作用 📖前言 输入部分主要包括源文本嵌入层以及位置编码器,目标文本…

HX1838红外接收模块-红外遥控(外部中断+状态机)

目录 红外遥控 模块介绍 HX1838红外接收二极管 红外发射遥控器 遥控器键码 模块接线 NEC协议编码 状态机分析 驱动代码 IR.h IR.c main.c 红外遥控 红外遥控是利用红外光进行通信的设备,由红外LED将调制后的信号发出,由专用的红外接收头进行…