Python进阶学习笔记(一)对象

1.对象模型

在面向对象理论中类和对象是不同的概念,而在python中类也是对象,叫做类型对象。

所以python中的类,实例对象,类型都是对象。

元类型:

在python中实例对象的类型为对应类型的对象,而类型的对象为type对象,如下代码:

from Test2 import  Test2
if __name__ == '__main__':s = "abc"extent=Test2() #Test2的实例化对象print(type(s),type(str),type(type))print(type(extent),type(Test2))
class Test2:print("test")

输出结果

<class 'str'> <class 'type'> <class 'type'>

<class 'Test2.Test2'> <class 'type'>

type对象是所有对象的元类型,包括它自己的元类型也是,如图,不同类型对象的类型都指向元类型:

object类型

object类型是所有类型的基类型,也就是任何一个类都默认继承object类,除了他自己。这是因为继承必须有一个终点。

如下代码:

from Test2 import  Test2
if __name__ == '__main__':s = "abc"extent=Test2() #Test2的实例化对象print(issubclass(Test2,object))print(issubclass(str, object))print(issubclass(type, object))

对象的引用

在python中变量只是一个名字,保存指向实际对象的指针。

不可变对像

当对不可变对象进行修改时,由于不可变对象在对象创建后的整个生命周期,其值都不可进行修改

当进行修改操作时会将会以新数值创建一个新对象,变量的指针指向新对象

输出结果

也就是说当对不可变变量对象修改时,仅仅只会改变该变量的指针,使之指向新的对象,而其他指向旧对象的变量指针不会fa。

可变对象

变量修改操作可以对原对象进行修改

如图对列表的添加操作

列表对象内部维护了一个动态数组,存储元素对象的指针,当进行增减时修改对应元素指针即可

变长对象与定长对象

对象预分配的空间大小是否固定

常见的变长对象如:整型,字符串,列表

定长对象如:浮点对象

2.对象在python内部的存在形式

python由c语言构成,对象在python中是由结构体实现的

PyObject ,对象的基石

除结构体之外第一行为宏定义,第二行为引用计数,第三行为类型指针。

引用计数实现垃圾回收,类型指针指向对象的的类型对象,类型对象描述实例对象的数据及行为。

PyVarObject,变长对象

在PyObject的基础上添加上ob_size,用于记录元素的个数

头文件准备了两个宏定义,方便其他对象的使用

#define PyObject_HEAD PyObject ob_base;

#define PyObject_VAR_HEAD PyVarObject ob_base;

例如浮点对象,通过PyObject的宏+双精度浮点数double来实现

列表对象,PyValObject的宏+动态数组来实现

其中allocated用来记录列表的总容量,ob_item,指向动态数组的指针

初始化头部的宏定义

PyObject_HEAD_INIT对定长对象的初始化,将应用计数设为1并将对象类型设置为给定类型,其中

PyVarObject_HEAD_INITPyObject_HEAD_INIT的基础上进一步设置长度字段

PyTyepObject,类型的基石

之前对象的结构已有引用次数,类型指针,以及变长对象的元素个数,但是缺少了对象的存储空间

以及此对象支持的操作。
其实上述联系通过ob_type参数来进行联系,它是类型指针,指向一个类型对象,其中的关键部分:

部分参数说明:

  • 类型名称 ,即 tp_name 字段;
  • 创建实例对象时所需的 内存信息 ,即 tp_basicsizetp_itemsize 字段;
  • 该类型支持的相关 操作信息 ,即 tp_printtp_getattr 等函数指针;

图解

由于类型对象全局唯一,可以将类型对象定义成全局变量,如PyFloatObject对应的全局变量中叫做PyFloat_Type

PyType_Type,类型的类型

在之前了解到引用对象的类型为对应的类型对象,就如上述的PyTypeObject,记录了Float类型的内存大小及支持的操作,它与PyFloat通过ob_type 进行关联。

类型对象也是有类型的,那么它也是应该通过ob_type关联的对象记录type类型的内存大小及支持的操作。如图所示:

参考资料:Python 源码深度剖析-慕课专栏 (imooc.com)

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

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

相关文章

14. PEFT:在大模型中快速应用 LoRA

如果你对LoRA还没有一个直观的概念&#xff0c;可以回看这篇文章&#xff1a;《3. 认识 LoRA&#xff1a;从线性层到注意力机制》。 我们将在这里进一步探讨如何快速地在大型预训练模型中应用 LoRA&#xff0c;并解答可能存在的问题&#xff0c;包括&#xff1a; peft 和 lora …

博途TIA v18下载时,需要重启才能安装下载路径是灰色改不了

一、需要重启才能安装 删除下面注册表P开头的文件&#xff1a; 二、下载路径是灰色改不了 注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion里找到C:\Program Files或者C:\Program Files&#xff08;x86&#xff09;&#xff0c;具体哪个看安装的时候对应…

TikTokDownloader 开源项目操作教程

TikTokDownloader TikTokDownloader 是一个开源的多功能视频下载工具&#xff0c;它专门用于从抖音和TikTok平台下载无水印的视频、图集和直播内容。这个工具支持批量下载账号作品、收藏内容&#xff0c;并可以采集详细数据。它提供了命令行和Web界面&#xff0c;具有多线程下…

arm-硬件

一、ARM体系与架构 ARM芯片组成 -- arm 体系中&#xff0c;一般讲到的芯片由两大部分组成&#xff1a;arm的内核、外设 arm内核&#xff1a; -- 其内核主要由&#xff1a;寄存器、指令集、总线、存储器映射规则、中断逻辑主调试组件构成。ARM公司只设计内核&#xff0c;授权给…

java intellij idea开发步骤,使用指南,工程创建与背景色字体配置,快捷键

intellij idea2021 配置背景色&#xff0c;字体大小&#xff0c;主题 快捷键

网站建设模板选择哪种

在选择网站建设模板时&#xff0c;需要考虑多个因素&#xff0c;包括网站的目的、受众、内容类型以及个性化需求等。以下是一些常见的网站建设模板类型&#xff0c;以及它们的特点&#xff0c;希望对你的选择有所帮助。 企业/商务模板&#xff1a; 企业和商务网站通常需要专业、…

14、主机、应用及数据安全解读

数据来源&#xff1a;14.主机、应用及数据安全解读_哔哩哔哩_bilibili

leetcode第十一题:盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例…

简单题101. 对称二叉树 (python)20240922

问题描述&#xff1a; python: # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right rightclass Solution(object):def isSymm…

Windows内网穿透远程桌面操作指南

1、登录NatCross官网https://www.natcross.com 账密登录或手机验证码登录。 2、点击左侧场景映射&#xff0c;选择【3389远程桌面】点击添加。 3、检查本地ip&#xff1a;127.0.0.1为本机&#xff0c;本地端口默认&#xff1a;3389&#xff0c;点击保存&#xff0c;系统生产成外…

【LeetCode】每日一题 2024_9_22 找到小镇的法官(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;找到小镇的法官 代码与解题思路 func findJudge(n int, trust [][]int) int {// 我当时的思路就是&#xff1a;每个人&#xff08;除了小镇法官&#xff09;都信任这位小镇法官。// 直接…

黑马头条day2-2 freemaker minio

其实就是freemaker生成一个静态页面 然后存储到minio上 返回一个链接在表里 最后直接通过url访问minio里边的动态页面 freemaker和minio 就是一个展示一个存储 下边这个弹幕感觉说的很清楚 遇到的问题 1 依赖报错 引不到依赖 一直没找到问题出在哪里 明明在pom文件里边引入了…

Docker配置代理解决pull超时问题

操作系统: CentOS Linux 8 Docker版本: 26.1.3 前置&#xff1a;你需拥有&#x1f431; 1. 配置 proxy.conf 1.1 创建配置文件目录 创建 docker.service.d&#xff0c;进入到 docker.service.d 中打开 proxy.conf (没有文件打开会自动创建)。 注意&#xff1a;每个人的路径可…

GRE隧道协议学习笔记

使用场景 分布在不同地理位置的总公司和分公司怎么通过网络连接起来&#xff1f; 可以使用ISP网络连接。在豆包中可以看到如下回答通俗的讲就是运营商收费提供网络服务&#xff0c;有个人的有企业的&#xff0c;企业的很贵 为什么要使用GRE隧道 当然你也可以用其他隧道协议…

C++_22_异常

文章目录 异常概念&#xff1a;**抛出异常&#xff1a;**关键字&#xff1a; **捕获异常&#xff1a;****栈解旋&#xff1a;****异常的接口声明&#xff1a;****异常对象的生命周期&#xff1a;**1 传递异常对象【不使用】2 传递异常对象指针【不使用】3 传递异常对象引用【**…

论 JAVA 集合框架中 接口与类的关系

前言 这是笔者在学习过程中的一篇"备忘录",其目的是能用最EZ最粗鄙的语言口述出 JAVA集合框架中 所有类与接口的关系 本人在不断地学习中,总会混淆集合框架中的类和接口,以及它们的作用关系,虽然不影响我的使用,但是我也不想一直糊涂下去,故而趁知识还没混淆之际,赶…

【练习16】求最小公倍数

链接&#xff1a;求最小公倍数_牛客题霸_牛客网 (nowcoder.com) 题目分析&#xff1a; 要求最小公倍数&#xff0c;要先用辗转相除法求最大公约数。假如有两个数a、b&#xff1a; 最小公倍数a*b / a和b的最大公约数 最大公约数 &#xff08;b, a % b&#xff09;&#xff0c;直…

Redis数据结构之zset

一.zset有序集合 它和集合唯一不同的就是&#xff0c;有序集合中的每一个元素都有一个唯一对应的浮点类型的分数与之关联着&#xff0c;是的有序集合中的元素可以维护有序性。 但是这个有序不适用下标作为排序的依据&#xff0c;而是使用这个分数。就好像排行榜一样&#xff…

Spark MLlib实践指南:从大数据推荐系统到客户流失预测的全流程建模

问题一 背景&#xff1a; 本题目基于用户数据&#xff0c;将据数据切分为训练集和验证集&#xff0c;供建模使用。训练集与测试集切分比例为8:2。 数据说明&#xff1a; capter5_2ml.csv中每列数据分别为userId , movieId , rating , timestamp。 数据&#xff1a; capte…

jboss

一。CVE-2015-7501 1.POC&#xff0c;访问地址 192.168.10.193:8080/invoker/JMXInvokerServlet 返回如下&#xff0c;说明接⼝开放&#xff0c;此接⼝存在反序列化漏洞 2.下载 ysoserial ⼯具进⾏漏洞利⽤ https://github.com/frohoff/ysoserial 将反弹shell进⾏base64编码…