Python番外篇:万法归一,一切皆对象

目录

Python中的对象

一切皆对象

数字是对象

字符串是对象

内置类型也是对象

函数和类也是对象

总结


Python中的对象

对象是Python对数据的抽象,在Python程序中,所有的数据,都可以由对象或对象之间的关系表示。
从某种意义上说,根据冯·诺依曼的“存储程序”的模型,代码也由对象表示。

在Python中,每个对象都有3个核心部分:
1)身份/标识(identity):对象的身份标识一旦被创建,在整个对象的生命周期都是不会改变的,CPyhon中将对象在内存中的存储地址,作为对象的身份标识。
前面已经用到过,使用id()函数可以返回一个表示对象身份标识的整数。

2)类型(type):对象的类型决定了该对象能够支持的运算、操作,以及该对象的取值范围。如同对象的身份标识一样,对象的类型在对象的整个生命周期中也是不可改变的。
通过type()函数可以返回一个对象的类型(它本身也是一个对象)。

3)值(value):某些对象的值可能会发生变化。值可以变的对象被称为是可变对象;而一旦创建后,其值就不可更改的对象称为不可变对象。
需要注意的是,我们知道数字、字符串、元组是不可变对象。但是,对象的不可变性是很微妙的,对象的不可变性与具有不可改变的值,并不是等价的。比如,元组中存储了可变对象的引用,则其元素是可更改的,但是元组对象本身仍然是不可变的对象。

从一切都是对象的角度来看,所谓的容器对象,其实是这些对象的值一般是其他对象的引用。

此外,如同前面的文章中已然提到过的:对于不可变类型,计算新值的操作,实际上可能返回对具有相同类型和值的任何现有对象的引用。而,对于不可变对象,这种操作则是不允许的。

# a和b,可能会,也可能不会引用值为1的同一个对象
a = 1
b = 1# c和d,一定会引用两个不同的、新创建的空列表对象
c = []
d = []

输出结果:

一切皆对象

不同于静态类型的编程语言,Python中的面向对象更加彻底,可以说一切皆对象。
前面已经提到,对象的3个核心组成:身份标识(id)、类型(type)、值。其中,通过函数type()我们可以看到对象的类型,也就是用于实例化这个对象的类。
接下里,我们通过对各种实体调用type()函数,来验证Python中一切皆对象。

数字是对象
a = 20
b = int.__int__(20)
print(f"对象a,id: {id(a)}, type:{type(a)}")
print(f"对象b,id: {id(b)}, type:{type(b)}")

对象可以有自己的属性和方法:

a = 20
b = int.__int__(20)
print(f"对象a,id: {id(a)}, type:{type(a)}")
print(f"对象b,id: {id(b)}, type:{type(b)}")# 数字的实部属性
print(a.real)
# 数字的虚部属性
print(a.imag)
# 方法bit_count()返回对象的二进制为1的个数
print(a.bit_count())
字符串是对象
s1 = 'Hello'
s2 = str.__str__('Hello')
print(s2)
print(f"对象s1,id: {id(s1)}, type:{type(s1)}")
print(f"对象s2,id: {id(s2)}, type:{type(s2)}")
print(s1.upper())
内置类型也是对象
a = int
b = str
print(f"对象a,id: {id(a)}, type:{type(a)}, value: {a}")
print(f"对象b,id: {id(b)}, type:{type(b)}, value: {b}")

可以看到,内置类型int,也是对象,这个对象的类型是type,也有自己的id;内置类型str也是类似的。

函数和类也是对象
def say_hello():print('hello')class MyClass:def __init__(self):passprint(f"对象say_hello,id: {id(say_hello)}, type:{type(say_hello)}, value: {say_hello}")
print(f"对象MyClass,id: {id(MyClass)}, type:{type(MyClass)}, value: {MyClass}")

输出结果:


函数对象和类对象,也有对应的属性和方法:

def say_hello():print('hello')class MyClass:def __init__(self):print(f"__init__ was called")print(f"对象say_hello,id: {id(say_hello)}, type:{type(say_hello)}, value: {say_hello}")
print(f"对象MyClass,id: {id(MyClass)}, type:{type(MyClass)}, value: {MyClass}")
print(say_hello.__name__)
print(say_hello.__code__)
say_hello.__call__()
print(MyClass.__bases__)
MyClass.__init__(MyClass)

输出结果:


可以看到,函数的__code__属性是一个code对象,也就是开篇提到的代码对象……


简单延伸一下:
Python中,代码对象和函数对象之间的区别在于,函数对象包含对函数全局变量(定义它的模块)的显式引用,而代码对象不包含上下文;默认参数值也存储在函数对象中,而不是代码对象中(因为它们表示在运行时计算的值)。与函数对象不同,代码对象是不可变的,并且不包含对可变对象的引用(直接或间接)。

总结

从上面示例代码中可以看出,内置类型int、str,以及自定义的类MyClass,这些类对象,都是由type这个类对象进行实例化的。那么type这个类对象又是谁实例化的呢?

print(type(int))
print(type(str))
print(type(MyClass))
print(type(type))


你没有看错,type类对象是由自己实例化的……

虽然,本文的内容有点绕,但是,必须说的是,Python中的“一切皆对象”的理念,使得Python具有高度的灵活性和一致性。无论是简单的数据类型还是复杂的函数和类,它们都是对象,并可以进行统一的操作。这种设计哲学使得Python代码更加简洁、优雅和易于维护。

当更多地将Python应用于实际场景之后,应该会有更深刻的体会。

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

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

相关文章

基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机GSM模块的家庭防火防盗报警系统设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 摘 要 原理图 仿真图 元器件清单 代码 系统论文 参考文献 资源下载…

几何建模-Parasolid中GO功能使用

1.背景介绍 1.1 Parasolid和它的接口间关系 1.2 什么是GO GO全称是Graphical Output.你的程序需要在屏幕或者打印设备上显示模型数据时。在需要使用PK中的某个渲染函数时创建图形显示数据时,Parasolid会调用GO相关的函数。GO函数会输出绘图指令给你的应用程序提供…

《昇思25天学习打卡营第14天|SSD目标检测》

SSD(Single Shot MultiBox Detector)是一种用于目标检测的深度学习算法。它的设计旨在同时检测多个对象,并确定它们在图像中的位置和类别。与其他目标检测算法相比,SSD具有速度快和精度高的特点,在实时检测应用中非常受…

昇思25天学习打卡营第18天|MindNLP ChatGLM-6B StreamChat

现在各类chat AI不胜枚举,开源的闭源的都有,ChatGLM-6B是其中一个开源的chat AI模型,我们可以使用mindspore轻松的跑起来这个模型 官方提供的jupyter示例里面却少了安装mindnlp和mdtex2html,所以需要先把这两个模块安装一下。 !…

【Dison夏令营 Day 17】使用 Python Turtle 的 24 游戏求解器

24 点 是一个数学谜题,用基本算术运算符(、-、、)将 4 个数字运算成 24。例如,给定 4 个数字 1,5,5,5,我们可以得到表达式 (5-(15))5,等于 24。 我们可以用 Python 程序暴力解决这个问题。最多有 245444 7…

【游戏客户端】大话slg玩法架构(三)建筑控件

【游戏客户端】大话slg玩法架构(三)建筑控件 大家好,我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构,关于SLG玩法的介绍可以参考这篇上一篇文章:【游戏客户端】制作率土之滨Like玩法 PS:和之前…

谈谈软件交互设计

谈谈软件交互设计 交互设计的由来 交互设计(Interaction Design)这一概念,最初是由IDEO创始人之一Bill.Moggridge(莫格里奇)1984年在一次会议上提出。他设计了世界上第一台笔记本电脑Compass,并写作出版了在交互设计领域影响深远的《Designing Interactions》一书,被称…

请不要把「团队」二字挂在嘴边上

请不要把「团队」二字挂在嘴边上 什么是团队? 团队(Team)是由 基层和 管理层人员组成的一个 共同体,它合理利用每一个 成员的知识和技能协同工作,解决问题,达到 共同的目标。 团队的构成要素总结为5P,分别为目标、人、 定位、权限、计划。 群体不是团队 “团队”和“…

智能合约和分布式应用管理系统:技术革新与未来展望

引言 随着区块链技术的不断发展,智能合约和分布式应用(DApps)逐渐成为数字经济中的重要组成部分。智能合约是一种自执行的协议,能够在预设条件满足时自动执行代码,而无需人工干预或中介机构。这种自动化和信任机制极大…

使用Apache服务部署静态网站

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 目录 一、网站服务程序 ​二、配置服务文件参数 ​三、SELinux安全子系统 四、个人用户主页功能 ​五、虚拟网站主机功能 六、Apache的访问控制…

nx上darknet的使用-目标检测-在python中的使用

1 内置的代码 在darknet中已经内置了两个py文件 darknet_video.py与darknet_images.py用法类似,都是改一改给的参数就行了,我们说一下几个关键的参数 input 要预测哪张图像weights 要使用哪个权重config_file 要使用哪个cfg文件data_file 要使用哪个da…

基于AT89C51单片机篮球计时计分器的设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机篮球计时计分器的设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 绪论 原理图 ​编辑 仿真图 系统总体设计图 代码实现 系统论文 资源下载 绪论 本次…

通用详情页的打造

背景介绍 大家都知道,详情页承载了站内的核心流量。它的量级到底有多大呢? 我们来看一下,日均播放次数数亿次,这么大的流量,其重要程度可想而知。 在这样一个页面,每一个功能都是大量业务的汇总点。 作为…

【Web开发手礼】探索Web开发的魅力(三)-html基础标签(3)

上述主要是对html标签的介绍和一些基本练习可以当作日常笔记收藏一下!!! 目录 前言 html基础标签 前言 上述主要是对html标签的介绍和一些基本练习可以当作日常笔记收藏一下!!! 提示:以下是本…

PostgreSQL 怎样处理数据仓库中维度表和事实表的关联性能?

文章目录 PostgreSQL 中维度表和事实表关联性能的处理 PostgreSQL 中维度表和事实表关联性能的处理 在数据仓库的领域中,PostgreSQL 作为一款强大的关系型数据库管理系统,对于处理维度表和事实表的关联性能是一个关键的问题。维度表和事实表的关联是数据…

【手写数据库内核组件】0301 动态内存池,频繁malloc/free让系统不堪重负,动态内存池让应用自由使用动态内存

动态内存管理 ​专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 动态内存管…

RSA算法详解:万字文章详解RSA的加密与解密

本文目录 文章前言一、RSA的诞生1、加密算法的前世今生① 《六韬龙韬》中的阴符与阴书② 古罗马:凯撒密码③ 斯巴达:塞塔式密码(Scytale) 2、对称加密的脆弱性3、非对称加密算法的出现 二、RSA中的数学概念与定理1、质数理论2、关…

使用Qt和mitmproxy开发一个抓取网页短视频的万能工具

目录 实现原理 mitmproxy介绍 功能简介 安装 脚本示例 如何使用 解释 注意事项 QT工具实现 其他资源 实现原理 使用WebView组件造一工具,工具可输入网页地址并显示网页内容及播放视频。把工具的代理设置指向mitmproxy的端口服务。配合使用mitmproxy的MITM技术,监…

7.8~7.10练习

目录 1.扑克牌游戏 2.链表基本功能的实现(单项链表) 3.移除链表元素力扣 4.反转链表力扣 5.链表的中间结点 5.返回倒数第k个节点​编辑 6.合并两个有序链表 7.链表基本功能的实现(双向链表) 8.链表分割 1.扑克牌游戏 public…

LightRAG:高效构建和优化大型语言模型应用的 PyTorch 框架

一、前言 随着大语言模型 (LLM) 的蓬勃发展,检索增强生成 (RAG) 技术作为一种将 LLM 与外部知识库结合的有效途径,受到了越来越多的关注。 然而,构建 LLM 应用的真正挑战在于开发者需要根据具体需求进行高度定制化,而现有的 RAG …