Python 类属性与实例属性

news2024/11/24 7:45:57

原文链接:https://blog.csdn.net/windyJ809/article/details/118197946


首先我们简要说下类属性与实例属性在概念上的不同之处:

类属性是在类中定义的属性,它是和这个类所绑定的,这个类中的所有对象都可以访问。访问时可以通过类名来访问,也可以通过实例名来访问。
实例属性是与类的实例相关联的数据值,是这个实例私有的,只有这个对象自己可以访问。当一个实例被释放后,它的属性同时也被清除了。
然后我们通过一个具体的例子,来看下在访问类属性和实例属性时,Python是怎么进行操作的。


# 定义了类之后,Python就会为类分配一块内存空间,里面放它的相关属性和方法。
# 这里在类中定一个了一个类属性,相当于在Person类的内存空间中有了值为10的age属性。
class Person():
    age = 10

# 给类名加上函数调用符号,就相当于创建了一个对象。
# 现在我们分别创建了一个叫沈腾的人和一个叫马丽的人。
# 创建后,Python也会为对象分别分配内存空间
st = Person()  
ml = Person()

# 使用对象访问类属性,它会先去对象的内存空间里面找age属性,如果没有,就向上找对象所属类的内存空间。
# 而在这里它并不是直接取了对象的内存空间的age属性,因为此时对象的内存空间里面还没有age属性。
# 这里实际上是对象访问了类的内存空间,从类内存空间中取出来age属性的值,并打印出来
# 所以这里沈腾对象属性值和马丽对象属性值都是类属性值10
print("st对象:%s" % st.age)  
print("ml对象:%s" % ml.age)

 # 要记住一点,只要给对象有了赋值操作,那么就相当于给对象的内存空间中动态创建了一个属性,所以这里此时沈腾对象的内存空间中有了一个age属性了,是属于这个对象的属性,也就是我们所说的实例属性。
 # 那么此时st.age会先在对象内存空间中找age属性,找到了,就不会再去类内存空间中找,所以此时st.age访问的是对象内存空间的age属性。
 # 所以此时沈腾对象属性值是沈腾对象内存空间age属性的值,也就是12。而非类属性值10。
st.age = 12 
print("st对象:%s" % st.age)

# 因为马丽对象还没有进行赋值操作,所以它还没有在它自己的内存空间中动态创建age属性。所以它这里访问的依旧是类内存空间中的age属性值。
# 而上述语句改变的是沈腾内存空间中age的值,所以不会影响到马丽对象属性值。
# 这里打印马丽对象属性值也就是类的属性值10。
print("ml对象:%s" % ml.age) 

# 因为上面的赋值语句改变的是对象的内存空间,所以类属性的值其实并没有改变,依旧是原来的值10。
print("类属性值:%s" % Person.age)  

我们看下具体的打印结果和我们分析的是否一致,可以看到,在没有st.age没有执行之前的打印值都是类属性的值10,而st.age=12执行后,st.age值就变成了12,而ml.age和Person.age都没有变,依旧是类属性的10。

在这里插入图片描述

我们再通过图解的形式理解下:

在这里插入图片描述 

在这里插入图片描述 

还有一点需要说明,我们可以在类的构造方法__init__中对对象的属性进行初始化,这里也是相当于对对象的属性进行了赋值操作,所以也是在对象的内存空间中动态的创建了实例属性。因为self参数就相当于对象自己,self.age在对象创建后就相当于对象.age,如st.age,ml.age,和上面例子原理是一样的。
 

class Person():
    age = 10
    def __init__(self, age):
        self.age = age


# 因为在构造方法中就已经给self.age属性赋值了。
# 所以创建对象时,沈腾对象内存空间中和马丽对象内存空间中就都有了age属性,这是属于对象的属性。
# 所以以后在使用st.age和ml.age时,访问到的都是对象内存空间中的age值了。
st = Person(18)  
ml = Person(9)

# 这里就访问的是对象内存空间中的age属性值了
# 所以分别打印18和9
print("st对象:%s" % st.age)  
print("ml对象:%s" % ml.age)

# 这里给沈腾对象的age属性重新赋值,改变的也仅是沈腾对象内存空间中的age属性值
# 不会改变马丽对象内存空间age属性值和类内存空间age属性值。
st.age = 12  
print("st对象:%s" % st.age)
print("ml对象:%s" % ml.age) 
print("类属性值:%s" % Person.age)  

我们来看下打印结果:

在这里插入图片描述

这个也来个图解吧

在这里插入图片描述

总结下:

类属性在类创建时就存在于类的内存空间中。
如果类的构造函数中没有初始化对象属性,那么对象在创建时内存空间是没有这个属性的。
实例属性是通过赋值语句来动态创建的。如果没有动态创建,通过对象访问和类同名的属性时,会现在对象内存空间中查找是否有该属性,没有就去类内存空间中查找。
如果已经动态创建了实例属性,那么Python使用对象访问和类同名的属性时,是一定先访问对象内存空间中的实例属性的。
 

 

 

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

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

相关文章

Android NFC 标签读写Demo与历史漏洞概述

文章目录前言NFC基础1.1 RFID区别1.2 工作模式1.3 日常应用NFC标签2.1 标签应用2.2 应用实践2.3 标签预览2.4 前台调度读写Demo历史漏洞总结前言 NFC 作为 Android 手机一个重要的短距特性,基本在所有 Android 中高端机型上均有支持,但说实话本人原先却…

存储硬件与协议

存储硬件与协议存储设备的历史轨迹存储介质的进化3D NAND3D XPointIntel Optane存储接口协议的演变NVMeNVMe-oF网络存储技术1)DAS2)NAS3)SAN4)iSCSIiSCSI层次结构存储设备的历史轨迹 1.穿孔卡2.磁带3.硬盘4.磁盘(软盘…

【2023】【standard-products项目】中查找的问题与解决方案 (未完待续)

10、el-table 判断是多选操作还是单选操作 9、判断数组对象中是否包含某个指定值 需求:修改时数据回填el-select下拉数据,发现当前id在原数组里没有找到,就显示了id值,应该显示name名, 处理:当查找到id…

向量与矩阵 导数和偏导数 特征值与特征向量 概率分布 期望方差 相关系数

文章目录向量与矩阵标量、向量、矩阵、张量向量范数和矩阵的范数导数和偏导数特征值和特征向量概率分布伯努利分布正态分布(高斯分布)指数分布期望、⽅差、协⽅差、相关系数期望方差协⽅差相关系数向量与矩阵 标量、向量、矩阵、张量 标量(…

源码系列 之 ThreadLocal

简介 ThreadLocal的作用是做数据隔离,存储的变量只属于当前线程,相当于当前线程的局部变量,多线程环境下,不会被别的线程访问与修改。常用于存储线程私有成员变量、上下文,和用于同一线程,不同层级方法间传…

Jenkins 笔记

Jenkins brew install jenkins-lts brew services restart jenkins-lts brew services stop jenkins-lts b999ff5683464346b6d083f894968121 l 软件构建自动化 :配置完成后,CI系统会依照预先制定的时间表,或者针对某一特定事件,…

进阶C语言第三章-------《字符函数和内存函数》 完整思维导图+基本练习题+深入细节+通俗易懂+知识点+建议收藏

绪论 书接上回,通过进阶指针你已经了解到了更多种指针类型,他们的用法及使用之处相当的关阔需要不断的积累经验来使用,这里我毛遂自荐一下我的指针练习希望对你有帮助,本章是一些关于字符串的函数介绍和自己实现,总体来…

数据结构与算法基础-学习-11-线性表之链栈的初始化、判断非空、压栈、获取栈长度、弹栈、获取栈顶元素

一、个人理解链栈相较于顺序栈不存在上溢(数据满)的情况,除非内存不足,但存储密度会低于顺序栈,因为会多存一个指针域,其他逻辑和顺序表一致。总结如下:头指针指向栈顶。链栈没有头节点直接就是…

智慧校园应用系统建设方案

系统简介 建设“智慧校园”的核心是创新新形势下高校发展理念、推进高校建设转型、变革高校管理行为方式;建设“智慧校园”的目的是推进信息化进入高校、服务管理、惠及师生;建设“智慧”的目标是实现 “信息采集、数据整合、信息促管、信息育人、信息联…

linux之echo使用技巧

参考文章:linux基本功系列-echo命令实战一、echo 命令是什么?作用: echo命令能将指定文本显示在Linux命令行上,或者通过重定向符写入到指定的文件中。语 法:echo [-ne][字符串] / echo [–help][–version]补充说明&am…

VMware安装CentOS7

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。个人爱好: 编程,打篮球,计算机知识个人名言:海不辞水,故能成其大;山不辞石…

Java+Python+HanLP自然语言处理包实现解析文本分词

目录 需要安装 Python部分 Java部分 需要安装 HanLP官网Api教程 https://bbs.hanlp.com/t/hanlp2-1-restful-api/53 首先需要电脑安装Python环境并配置环境变量(网上搜就可以一大堆教程),建议Python版本3 然后根据HanLP官网教程安装hanl…

「JVM 原理使用」 实际开发中的应用

Class 文件格式、执行引擎主要以 Class 文件描述了存储格式、类何时加载、如何连接、VM 如何执行字节码指令,这些动作基本都是 JVM 直接控制,用户代码无法干预和改变; 用户可以干预的只有字节码生成、类加载器两部分,而这两部分的…

Android 面试 基础知识汇总

Android常用的设计模式HTTP和HTTPS的区别TCP/UDP的区别

PendingIntent兼容安卓12 的一个问题

这是我第一次遇到这个问题,反正我也是第一次做完整的安卓app,很多个第一次。我之前做的那个老旧手机做桌面摆件的app,因为原来的“无干预”版本无法使用,所以又用回了“和风版”,但这个版本很久没用了,有些…

实用机器学习-学习笔记

文章目录9.1模型调参9.1.1思考与总结9.1.2 基线baseline9.1.3SGD ADAM9.1.4 训练代价9.1.5 AUTOML9.1.6 要多次调参管理9.1.7复现实验的困难9.1模型调参 9.1.1思考与总结 1了解了baseline和调参基本原则 2了解了adams和sgd的优劣 3了解了训练树和神经网络的基本代价 4了解了a…

【蓝桥杯集训2】差分专题(3 / 4)

目录 差分模板 1、一维差分 2、二维差分 3729. 改变数组元素 - 差分 区间修改 100. 增减序列 - 差分模板 1、一维差分 活动 - AcWing 给a数组 [l,r] 区间的每个数c,只需要给其差分数组b做如下操作即可 b[l]c; b[r1]-c; 差分数组 a[]是b[]的前缀和数组 如果…

倒计时100天 | DBF深圳国际户外运动博览会5月一起狂飙初夏

狂飙初夏的大型户外运动嘉年华即将登场!2023年5月26日至28日,第四届DBF深圳国际户外运动博览会(简称DBF深圳户外展)将于深圳国际会展中心(宝安)举办。本届展会展览面积超过7万平方米,预计将吸引…

保姆级Vue3+Vite项目实战黑白模式切换

写在前面注:本文首发掘金签约专栏,此为文章同步!本文为 Vue3Vite 项目实战系列教程文章第四篇,系列文章建议从头观看效果更佳,大家可关注专栏防走失!点个赞再看有助于全文完整阅读!此系列文章主…

C/C++【内存管理】

✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 Love is a choice. It is a conscious commitment. It is something you choose to make work every day with a person who has chosen the same thi…