py一切皆对象:

那么Type也是个对象。对象类型叫PyTypeObject

demo

>>> a = 1
>>> a
1 >>> type(a)
<type 'int'> int类型 #等价的两个
>>> type(int) int类型的类型就是type
<type 'type'>
>>> type(type(a)) type(a)是int类型的类型就是type
<type 'type'> #还是等价的两个
>>> type(type(int))
<type 'type'>
>>> type(type(type(a)))
<type 'type'> # 1. int 的 类型 是`type`
>>> type(int)
<type 'type'>
# 2. type 的类型 还是`type`, 对应上面说明第二点
>>> type(type(int))
<type 'type'>

1. 首先, 定义一种类型对象叫PyTypeObject

定义

typedef struct _typeobject {

  /* MARK: base, 注意, 是个变长对象*/
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */ //类型名
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ // 创建该类型对象时分配的内存空间大小 // 一堆方法定义, 函数和指针
/* Methods to implement standard operations */
printfunc tp_print;
hashfunc tp_hash; /* Method suites for standard classes */
PyNumberMethods *tp_as_number; // 数值对象操作
PySequenceMethods *tp_as_sequence; // 序列对象操作
PyMappingMethods *tp_as_mapping; // 字典对象操作 // 一堆属性定义
.... } PyTypeObject;

说明

  • PyObject_VAR_HEAD 变长对象
  • const char *tp_name tp_name, 类型名字符串数组
  • 所有Type对象都是PyTypeObject的”实例”:
    • 比如int类型:PyType_Type/PyInt_Type

2. 然后, 用PyTypeObject初始化得到一个对象PyType_Type

定义

PyTypeObject PyType_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"type", /* tp_name */
sizeof(PyHeapTypeObject), /* tp_basicsize */
sizeof(PyMemberDef), /* tp_itemsize */
(destructor)type_dealloc, /* tp_dealloc */ // type对象的方法和属性初始化值
..... };

说明

  • tp_name

    类型名, 这里是”type”
  • PyVarObject_HEAD_INIT(&PyType_Type, 0)

    PyVarObject_HEAD_INIT, 这个方法在 Include/object.h中,

    等价于

    ob_refcnt = 1

    *ob_type = &PyType_Type

    ob_size = 0

    即, PyType_Type的类型是其本身!


3. 再然后, 定义具体的类型, 这里以PyInt_Type为例子

定义

PyTypeObject PyInt_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"int",
sizeof(PyIntObject),
0, // int类型的相关方法和属性值
.... (hashfunc)int_hash, /* tp_hash */ };

说明

  • “int”

    PyInt_Type的类型名是int
  • PyVarObject_HEAD_INIT(&PyType_Type, 0)

    PyInt_Type的

    *ob_type = &PyType_Type

使用
>>> type(1)
<type 'int'>
>>> type(type(1))
<type 'type'>

4. 最后, 生成一个整数对象int

定义

typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;

结构

  • PyIntObject为整数类型
  • 声明一个整数后得到整数对象
  • 对象ob_type指向PyInt_type对象

=========================

总结:

  1. 一切都是对象 什么都是PyObject/PyVarObject对象
  2. PyType_Type / PyInt_Type / PyString_Type ….等

    这些是类型对象, 可以认为是同级, 都是PyTypeObject这种类型的实例!
  3. 虽然是同级,

    但是其他PyXXX_Type, 其类型指向 PyType_Type

    PyType_Type 的类型指向自己, 它是所有类型的类型
  4. PyTypeObject 是一个变长对象
  5. 每个object, 例如PyIntObject都属于一种类型

    object初始化时进行关联

《Python 源码阅读》之 类型Type的更多相关文章

  1. PYTHON 源码阅读

    http://www.wklken.me/posts/2015/09/29/python-source-gc.html http://www.wklken.me/archives.html https ...

  2. FreeCAD源码阅读笔记

    本文目标在于记录在FreeCAD源码阅读中了解到的一些东西. FreeCAD编译 FreeCAD源码的编译最好使用官方提供的LibPack,否则第三方库难以找全,找到之后还需要自己编译,此外还不知道C ...

  3. python3 源码阅读-虚拟机运行原理

    阅读源码版本python 3.8.3 参考书籍<<Python源码剖析>> 参考书籍<<Python学习手册 第4版>> 官网文档目录介绍 Doc目录主 ...

  4. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  5. 读python源码--对象模型

    学python的人都知道,python中一切皆是对象,如class生成的对象是对象,class本身也是对象,int是对象,str是对象,dict是对象....所以,我很好奇,python是怎样实现这些 ...

  6. [PHP源码阅读]explode和implode函数

    explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...

  7. 源码阅读系列:EventBus

    title: 源码阅读系列:EventBus date: 2016-12-22 16:16:47 tags: 源码阅读 --- EventBus 是人们在日常开发中经常会用到的开源库,即使是不直接用的 ...

  8. EventBus源码解析 源码阅读记录

    EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...

  9. 36 网络相关函数(四)——live555源码阅读(四)网络

    36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...

随机推荐

  1. 监控sql运行时剩余时间

    --监控sql执行时剩余时间 你知道正在执行的sql大概须要多长时间么? 你知道正在执行的sql大概完毕了百分之几么? 你知道正在执行的sql大概还要多长时间完毕么? V$SESSION_LONGOP ...

  2. 何时使用static类(工具类)

    一个static类,指所有成员都是static方法构成的.而没有不论什么成员变量, 也称为Utility class 或者Utility Pattern [參考: Utility Pattern].它 ...

  3. luogu2761 软件补丁问题 状态压缩最短路径

    关键词:状态压缩 最短路径 想不出快速办法,就先考虑考虑暴力.枚举每一种错误分布的情况,然后通过可用的补丁转化为另多种情况,这些情况又转化为更多种情况……我们可以用图来表示这种关系! 状态压缩:每个错 ...

  4. 升鲜宝V2.0_杭州生鲜配送行业,升鲜宝供应链手机分拣系统使用说明_升鲜宝生鲜供应链管理系统_15382353715_余东升

    1. 系统概述 升鲜宝供应链手机分拣系统(Android版)是升鲜宝供应链管理系统的配套分拣系统,本系统适用于农副产品生鲜配送供应链企业分拣过程,在线上数据管理和线下业务管理两大方面提供解决方案,该系 ...

  5. .NET微服务架构及API网关

    一.MSA简介 1.1.MSA是什么 微服务架构MSA是Microservice Architecture的简称,它是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相通讯.互相配合, ...

  6. python之路——二分查找算法

    楔子 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做? l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72 ...

  7. css中单位的使用

    css中许多的属性都需要添加长度,而长度一般由数字和单位构成,如1px,1.5em,2vh:也可以省略单位,如line-height:1.5,表示行高为字体大小的1.5倍: 长度单位一般也分为相对长度 ...

  8. Java基础8一面向对象

    一.JavaBean标准的定义规范 1.类中所有的属性必须是私有的,也就是说属性必须用private修饰. 2.提供一个公共无参数的构造方法. 3.为所有私有的属性提供公共的set和get方法. se ...

  9. 【Oracle】ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

    出现此错误的原因是因为事务等待造成的,找出等待的事务,kill即可. 下面是我当时遇到的错误: ---删除表t1时出现错误 SCOTT@GOOD> drop table t1; drop tab ...

  10. ArcGIS Javascript API 加载高德在线地图扩展

    利用ArcGIS JavaScript API加载高德在线地图的扩展 /** * Created by WanderGIS on 2015/7/15. */ define(["dojo/_b ...