当前位置: 首页 > news >正文

32、Python之面向对象:对象的表示,再论Python是dict包括语法糖

引言

在前面介绍Python容器的时候,我们曾经用过这种夸张的表述,“Python就是包裹在一堆语法糖中的字典”。虽然夸张,其实更多的是为了突出Python中dict的强大之处。今天这篇文章,打算看下Python中类对象、实例对象的表示及内存管理,又会涉及到dict。

实例对象的__dict__属性

先说结论,从内部实现的角度来看,实例是使用字典(dict)来实现的。

前面介绍私有化属性时,已经简单用到过__dict__这个属性,可以通过实例的__dict__ 属性访问实例底层的字典。这个字典包含的数据对每个实例而言都是唯一的。可以在任何时候向实例添加新属性。也是通过__dict__。

对实例的修改始终会反映到局部__dict__ 属性中。同样,如果直接对__dict__ 进行修改,所做的修改也会反映在实例的属性中。

通过代码来验证这个结论:

class DaGongRen:def __init__(self, name, age, salary):self.name = nameself.age = ageself.__salary = salarydef get_salary(self):return self.__salaryif __name__ == '__main__':dgr = DaGongRen('张三', 18, 100)# 从__dict__中可以看到实例所有的属性,包括混淆名称后的私有属性print(dgr.__dict__)# 通过obj.attr的方式修改属性dgr.age = 20# 再次查看__dict__,age对应的value同步变更print(dgr.__dict__)# 通过__dict__直接修改value值dgr.__dict__['name'] = '李四'# 实例的属性同步发生变更print(dgr.name)# 私有属性也一样dgr.__dict__['_DaGongRen__salary'] = 9999print(dgr.get_salary())

执行结果:

618a092c81e2ca4e4cd8b660a197377b.jpeg

类对象的__dict__属性

其实,类本身也只是对字典的浅层包装,我们可以在实例的__dict__ 属性中找到这个字典。

直接看代码:

from rich.pretty import pprintclass DaGongRen:"""这里是说明文档,会存储在__doc__属性中"""cnt = 0def __init__(self, name, age, salary):self.name = nameself.age = ageself.__salary = salaryself.__class__.cnt += 1def get_salary(self):return self.__salary@classmethoddef test_class_method(cls):print(cls)@staticmethoddef test_static_method():print("test")if __name__ == '__main__':# 查看类对象的__dict__pprint(DaGongRen.__dict__)dgr = DaGongRen('张三', 18, 100)# 通过类对象的__dict__调用get_salary()方法,由于是通过类对象调用,第一个参数self需要手动传递print(DaGongRen.__dict__['get_salary'](dgr))# 调用类方法DaGongRen.__dict__['test_class_method'].__func__(DaGongRen)# 调用静态方法DaGongRen.__dict__['test_static_method'].__func__()

执行结果:

6b3b928ad9c0b584750296f082aac102.jpeg

从执行结果中,可以看出,类对象也是有__dict__属性的,存储的是在类中定义的实例方法、类方法和静态方法以及类属性等。

总结

通过对比实例对象的__dict__和类对象的__dict__相关代码的示例,可以得出如下结论:

1、对象底层是对dict做了一层弱封装,不管是实例对象还是类对象。

2、类中定义的类属性属于类,存储在类对象的__dict__属性对应的字典中;类的__init__初始化方法或者实例对象中动态添加的属性,属于实例对象,存储在实例对象的__dict__属性对应的字典中。

3、类中定义的方法,不管是实例方法、类方法,还是静态方法,都属于类,统一存储在类对象的__dict__属性对应的字典中。

4、实例方法其实就是普通的函数对象,类方法和静态方法分别对函数对象做了一层对应的封装。

通过这篇文章,我们应该能够对类、实例的存储有了更进一步的理解。

但是,还有一个问题。既然,Python中一切皆对象,对象底层又是对dict的封装,那么问题来了,为什么有些内置类型的对象没有__dict__属性,或者无法在__dict__属性中找到类中定义的实例属性?

这个问题,涉及到对象内存的管理与优化,我们放到下一篇文章中来回答。

感谢您的拨冗阅读,如果对您学习Python有所帮助,欢迎点赞、收藏。

相关文章:

32、Python之面向对象:对象的表示,再论Python是dict包括语法糖

引言 在前面介绍Python容器的时候,我们曾经用过这种夸张的表述,“Python就是包裹在一堆语法糖中的字典”。虽然夸张,其实更多的是为了突出Python中dict的强大之处。今天这篇文章,打算看下Python中类对象、实例对象的表示及内存管理…...

高级java每日一道面试题-2024年8月07日-网络篇-你对TCP的三次握手了解多少?

如果有遗漏,评论区告诉我进行补充 面试官: 你对TCP的三次握手了解多少? 我回答: TCP(Transmission Control Protocol)的三次握手是TCP建立连接的过程,它是TCP/IP协议族中一个关键的概念。三次握手确保了双方之间的连接是双向的&#xff0…...

vite.config.ts中proxy的rewrite理解

服务器配置都是在开发情况下适用!! // 服务器配置 server: {//允许IP访问host: "0.0.0.0",//应用端口(默认:3000)port: Number(env.VITE_APP_PORT),// 运行是否自动打开浏览器open: true,// 代理配置proxy:…...

大数据环境下用户数据隐私安全防护系统的设计与实现(论文+源码)_kaic

摘 要 现如今互联网已在世界范围内广泛的应用和发展,特别是移动互联网Web 技术快速发展,然而最近几年经常发生互联网用户信息泄露及财产损失问题,网络安全漏洞严重威胁Web应用程序安全及互联网用户的网络使用安全,因此现急需一…...

基于springboot+vue+uniapp的“口腔助手”小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...

算法刷题之链表

// 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 };ListNode* head new ListNode(5); 重要方法:虚拟头节点 个人方法:指针转为数组…...

C# 设计模式之适配器模式

总目录 前言 在实际的开发过程中,由于需求的变化和扩展,我们的代码也需要做相应的扩展。想象这样一个场景,原项目中接口返回的数据是XML格式的数据,但现在来了一个新客户,它期望接口返回的数据类型为json格式的。想要…...

BFS实现迷宫最短路径

结合队列的知识利用 广度优先遍历,通过对能走的路径的记录以及对走过路径的标记,进行多条路搜查 一、理论基础 如下图的迷宫: 选取所走方向(针对某一个位置)下,右,上,左&#xff0…...

Linux IPC解析:匿名命名管道与共享内存

目录 一.IPC机制介绍二.匿名与命名管道1.匿名管道2.命名管道3.日志 三.共享内存三.System V 标准1.System V简介2.IPC在内核的数据结构设计3.信号量 一.IPC机制介绍 IPC(Inter-Process Communication,进程间通信)是计算机系统中不同进程之间交…...

Codeforces Round 964 (Div. 4) A~G

封面原图 画师ideolo A - AB Again? 题意 给你一个两位数&#xff0c;把他的个位和十位加起来 代码 #include <bits/stdc.h> using namespace std; typedef long long ll; typedef double db; typedef pair<int,int> pii; typedef pair<ll,ll> pll;voi…...

单体应用提高性能和处理高并发-使用缓存

要在单体应用中实现高并发&#xff0c;并利用缓存技术来提高性能&#xff0c;需要深入了解缓存的应用场景、选择合适的缓存工具&#xff0c;以及在具体代码中实现缓存策略。以下是详细说明如何在单体应用中使用缓存来处理高并发的内容&#xff0c;包括常见的缓存框架和实际的代…...

ollama教程——使用LangChain调用Ollama接口实现ReAct

ollama入门系列教程简介与目录 相关文章: Ollama教程——入门:开启本地大型语言模型开发之旅Ollama教程——模型:如何将模型高效导入到Ollama框架Ollama教程——兼容OpenAI API:高效利用兼容OpenAI的API进行AI项目开发Ollama教程——使用LangChain:Ollama与LangChain的强强…...

【Bug分析】Keil报错:error: #18:expected a “)“问题解决

【Bug分析】Keil报错&#xff1a;error: #18:expected a “&#xff09;”问题解决 前言bug查找bug解决方法小结 前言 keil编译时出现一个问题&#xff0c;缺少一个右括号。然后仔细查看代码&#xff0c;并没有括号缺失。 如下&#xff0c;代码括号正常。 bug查找 站内文章…...

MAC上设置快捷打开终端以及如何运用剪切快捷键

在Mac上设置一个快捷键&#xff0c;在当前文件夹中打开终端&#xff0c;你可以使用Automator创建一个服务&#xff0c;然后将其分配给一个快捷键。以下是步骤&#xff1a; 1. 创建Automator服务 打开 Automator&#xff08;你可以在应用程序文件夹中找到它&#xff0c;或使用…...

linux docker安装 gitlab后忘记root密码如何找回

1. docker ps - a 查看当前gitlab 当前的id2. docker exec -it gitlab /bin/bash 进入docker git 容器中【gitlab 注意可以上图中的name&#xff0c;也可以是id都可以的】,如下图3.gitlab-rails console -e production 输入该指令&#xff0c;启动Ruby on Rails控制台&…...

C语言典型例题27

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.4 用下面的scanf函数输入数据 使a3,b7,x8.5,y71.8,c1A,c2a。问在键盘上怎么输入 代码 //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习题2.4 用下面的scanf函数输入数据&#xff0c;使…...

clion开发stm32f4系列(一)————移植rt-thread os系统

前言 本次使用的rt-thread的版本为5.0.2基于rt-thread sudio生成的源码进行拷贝和修改工程基于上次创建工程的项目进行修改。本次工程只是用了serial和pin组件,其他后面用到再进行添加 拷贝rt-thread源码库 通过CMakeLists来进行管理 顶级(rt-thread目录) cmake_minimum_req…...

计算机网络(网络层)

网络层概述 网络层是干什么的&#xff1f; 网络层的主要任务是实现不同异构网络互连&#xff0c;进而实现数据包在各网络之间的传输相比于数据链路层的以太网通信&#xff0c;网络层则是将一个个数据链路层连接的以太网通过路由器连接起来。从而实现不同数据链路层的互联。 这…...

Python3 第六十六课 -- CGI编程

目录 一. 什么是 CGI 二. 网页浏览 三. CGI 架构图 四. Web服务器支持及配置 五. 第一个CGI程序 5.1. HTTP 头部 5.2. CGI 环境变量 六. GET和POST方法 6.1. 使用GET方法传输数据 6.1.1. 简单的url实例&#xff1a;GET方法 6.1.2. 简单的表单实例&#xff1a;GET方法…...

【Unity23种设计模式】之状态模式

首先创建一个项目 打开项目后复制至3个场景 命名为 创建一个空物体 命名为GameLoop 创建一个脚本GameLoop.cs 编写代码如下 将代码挂载至空物体GameLoop 将三个场景拖拽至Scenes In Build 分析下状态模式的类图 我们创新类图中的代码 编写ISceneState.cs 编写三个状态子类继承构…...

Linux内核中的命名空间详解

Linux内核中的命名空间详解 引言 命名空间&#xff08;Namespace&#xff09;是Linux内核中实现资源隔离的重要机制&#xff0c;它为容器技术提供了基础支持。通过命名空间&#xff0c;不同的进程可以看到不同的系统视图&#xff0c;实现了进程间的隔离。本文将深入探讨Linux内…...

Glyph视觉推理快速上手:从镜像拉取到网页推理全流程

Glyph视觉推理快速上手&#xff1a;从镜像拉取到网页推理全流程 1. 引言&#xff1a;为什么选择Glyph视觉推理 想象一下&#xff0c;你需要处理一本几百页的小说内容&#xff0c;传统的大模型需要消耗大量显存来存储这些文本的token信息。而Glyph视觉推理模型提供了一种全新的…...

最强 AI Coding Agent 架构深度解构

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

如何用PySR快速发现数据背后的数学规律:3大优势让符号回归变得简单

如何用PySR快速发现数据背后的数学规律&#xff1a;3大优势让符号回归变得简单 【免费下载链接】PySR High-Performance Symbolic Regression in Python and Julia 项目地址: https://gitcode.com/gh_mirrors/py/PySR 符号回归作为机器学习领域的"白盒建模"神…...

BERT文本分割模型部署:为语音转写稿添加段落结构

BERT文本分割模型部署&#xff1a;为语音转写稿添加段落结构 1. 引言&#xff1a;语音转写稿的结构化困境 在会议记录、在线课程、访谈整理等场景中&#xff0c;我们经常需要将语音内容转换为文字稿。虽然自动语音识别(ASR)技术已经相当成熟&#xff0c;但生成的文本往往缺乏…...

实时反馈断层、特征偏移误判、推理链路静默降级……AI灰度发布6大暗礁(含可观测性埋点配置清单)

第一章&#xff1a;AI原生软件研发灰度发布策略设计 2026奇点智能技术大会(https://ml-summit.org) AI原生软件具备模型动态加载、推理路径可编程、反馈闭环实时驱动等特性&#xff0c;其灰度发布不能简单复用传统微服务的流量切分逻辑&#xff0c;而需耦合模型版本、特征服务…...

Ostrakon-VL在Qt桌面应用中的集成:开发跨平台视觉工具

Ostrakon-VL在Qt桌面应用中的集成&#xff1a;开发跨平台视觉工具 1. 为什么选择QtOstrakon-VL组合 在开发跨平台视觉分析工具时&#xff0c;Qt框架和Ostrakon-VL模型的组合提供了独特优势。Qt作为成熟的跨平台GUI框架&#xff0c;可以轻松构建Windows、Linux和macOS上的原生…...

渗透测试报告撰写:漏洞发现到验证流程

渗透测试报告的核心是“如实记录漏洞、清晰呈现流程”&#xff0c;很多人觉得撰写复杂&#xff0c;其实只要抓住“漏洞发现—漏洞验证—报告呈现”三个核心环节&#xff0c;就能写出规范且易懂的报告。全程无需堆砌专业术语&#xff0c;重点是把“怎么找到漏洞、怎么确认漏洞、…...

kaishi啦啦啦啦

...

ROFL播放器:英雄联盟回放文件的终极管理工具

ROFL播放器&#xff1a;英雄联盟回放文件的终极管理工具 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟回放文件无法播放…...