python源码解剖
print()本身就是用了多态:不同类型的对象,其实是调用了自身的print()方法
多态:动物 狗1 = new狗()
用公共的部分来指定类型,实则是调用各自的属性
创建对象有两种方式:
通过C API(存疑惑)
通过类型对象
(C语言运行机制)
python中的类型都是来自对C中相应类型的包装,object是由struct定义的,python本身就是用C写出来的,那C的背后呢
运行时rumtime就是程序运行的时候。
运行时库就是程序运行的时候所需要依赖的库。运行的时候指的是指令加载到内存并由CPU执行的时候。
C代码编译成可执行文件的时候,指令没有被CPU执行,这个时候算是编译时,就是编译的时候。
硬盘代码-编译-内存-CPU,内存分配就涉及到对象所在的堆和变量所在的栈
malloc的全称是memory allocation,内存分配
PyObject
ob_refcnt
*ob_type
PyVarObject
PyObject_HEAD
ob_size:元素的个数
PyIntObject
PyObject_HEAD
ob_ival:存放‘值’信息,如int类型的5,string类型的‘python’等
PyStringObject
PyVarObject_HEAD
ob_shash:保存string对象的hash值
ob_sstate:标记了这个string对象是否经过了intern机制的处理
ob_sval:指向大小为ob_size+1的内存(+1是因为‘\0’),ob_sval[ob_size]==’\0‘
PyListObject
PyVarObject_HEAD
ob_item:指向元素内存的指针(因为列表对象分为两部分:一部分是对象本身所在的内存,另一部分是列表元素所在的内存,这两块内存是分离的,所以需要在对象本身中的ob_item来指向元素所在的内存,来将对象与数据联系起来)
allocated:为PyListObject申请的一块内存的总大小
(比如为新的PyListObject申请了能放10个元素的内存,已经放了5个,那么allocated为10,ob_size为5)
python源码解剖的更多相关文章
- 读python源码--对象模型
学python的人都知道,python中一切皆是对象,如class生成的对象是对象,class本身也是对象,int是对象,str是对象,dict是对象....所以,我很好奇,python是怎样实现这些 ...
- VS2013编译python源码
系统:win10 手头有个python模块,是用C写的,想编译安装就需要让python调用C编译器.直接编译发现使用的是vc9编译,不支持C99标准(两个槽点:为啥VS2008都还不支持C99?手头这 ...
- 三种排序算法python源码——冒泡排序、插入排序、选择排序
最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...
- 《python源码剖析》笔记一——python编译
1.python的架构: 2.python源码的组织结构: 3.windows环境下编译python:
- 转换器5:参考Python源码,实现Php代码转Ast并直接运行
前两个周末写了<手写PHP转Python编译器>的词法,语法分析部分,上个周末卡文了. 访问器部分写了两次都不满意,没办法,只好停下来,参考一下Python的实现.我实现的部分正好和Pyt ...
- python源码书籍
<Python源码剖析>一书现在很难买到,目前大部分都是电子书. 为了更好地利用Python语言,无论是使用Python语言本身,还是将Python与C/C++交互使用,深刻理解Pytho ...
- 类似py2exe软件真的能保护python源码吗
类似py2exe软件真的能保护python源码吗 背景 最近写了个工具用于对项目中C/C++文件的字符串常量进行自动化加密处理,用python写的,工具效果不错,所以打算在公司内部推广.为了防止代码泄 ...
- Python源码中的PyCodeObject
1.Python程序的执行过程 Python解释器(interpreter)在执行任何一个Python程序文件时,首先进行的动作都是先对文件中的Python源代码进行编译,编译的主要结果是产生的一组P ...
- Python源码学习(一)
考虑到性能的要求,我在工作中用的最多的是c/c++,然而,工作中又经常会有一些验证性的工作,这些工作对性能的要求并不高,反而对完成的效率要求更高,对于这样的工作,用一种开发效率高的语言是合理的想法,鉴 ...
随机推荐
- sql server 2019 & spark
https://cloudblogs.microsoft.com/sqlserver/2019/04/01/how-to-develop-and-submit-spark-jobs-to-sql-se ...
- 云服务器、VPS、虚拟主机三者之间的区别?
更多精彩内容欢迎访问我的个人博客皮皮家园:https://www.zh66.club期待您的光临哦!我是皮皮猪,感谢各位光临,能为您排忧解难小站深感荣幸!祝您生活愉快! 什么是虚拟主机? 同云主机不一 ...
- java识别死亡或者存活的对象
那些内存需要回收 内存回收是对运行时内存区域的内存回收,其中程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊的执行着出栈和入栈操作.每一个栈帧中 ...
- Postman界面了解
Postman界面了解 2019年3月21日去面试了一家软件测试,本以为自己对简历上写的技能都熟悉,跳个槽,涨点工资,想象很美好,现实太残忍.当问到做接口测试postman和swagger工具的时候, ...
- Axios构造函数学习笔记
Axios 构造函数 lib/core/axios.js ... var intercaptorManager = require(./IntercaptorManger); var dispatch ...
- 「vue基础」一篇浅显易懂的 Vue 路由使用指南( Vue Router 上)
大家好,今天的内容,我将和大家一起聊聊 Vue 路由相关的知识,如果你以前做过服务端相关的开发,那你一定会对程序的URL结构有所了解,我没记错的话也是路由映射的概念,需要进行配置. 其实前端这些框架的 ...
- Kafka producer异步发送在某些情况会阻塞主线程,使用时候慎重
最近发现一个Kafka producer异步发送在某些情况会阻塞主线程,后来在排查解决问题过程中发现这可以算是Kafka的一个说明不恰当的地方. 问题说明 在很多场景下我们会使用异步方式来发送Kafk ...
- datatable转layui表格【偏原理】
如题这个类负责把datatable转换为layui表格可以显示的内容.适合配合表格url字段的webapi服务端,为其返回响应字符串.代码如下:using System;using System.We ...
- windows 10 配置Java 环境变量(5步骤)
前提:1.windows 10 系统(不是win8,也不是win7)2.安装JDK步骤 1. 打开 环境变量窗口右键 This PC(此电脑) -> Properties(属性) -> A ...
- 49道spring面试题整理,附带答案
1.选择使用Spring框架的原因? 使用Spring: 第一是使用它的IOC功能,在解耦上达到了配置级别. 第二是使用它对数据库访问事务相关的封装. 第三就是各种其他组件与Spring的融合,在Sp ...