第二章对象模型(2):揭开对象的神秘面纱

PyType_Type和PyBaseObject_Type PyType_Type和PyBaseObject_Type一. 类型的类型—PyType_Tpye二. 类型之基—PyBaseObject_Type PyObject和PyTypeObject内容的最后指出下图中对实例对象和类型对象的理解是不完全正确的, 浮点类型对象全局唯一,Python在C语言层面实现过程中将其定义为一个全局静态变量,定义于Object/floatobject.c中,命名为PyFloat_Type。 PyTypeObject PyFloat_Type = { PyVarObje 阅读详情

前言:上一节中提到了很多的基本概念,是在python层面进行 描述的,总体概念。现在我们就具体了解下

python源码,基于C语言

概念复习

复习一下和要清楚的前面讲的基本概念:

面向对象理论中**“ 类** ”和**“ 对象 ”这两个重要概念,在 Python 内部均以对象**的形式存在。 “类”是一种对象,称为 类型对象 ;“类”实例化生成的“对象”也是对象,称为 实例对象。

根据上文描述的,根据对象的不同特点还可以进行分类:
可变对象: 对象创建后可以修改
不可变对象: 对象创建后不能修改
定长对象: 对象大小固定
变长对象: 对象大小不固定

(后面还有可调用对象等等)

C语言实现的底层

  • 首先 python对象在C语言底层 是一个结构体,组织对象占用的内存。 不同类型的对象,数据及行为均可能不同,因此不同类型的对象由不同的结构体表示。
  • 此外,对象对比为 人 的话,所有人都有鼻子眼睛,所以肯定具有一些共性,比如每一个对象都需要引用计数(进行垃圾回收机制),所以,表示对象的结构体室友一个公共的头部!

PYObject, 对象的基石

(因为书中有详细的介绍,源码的出处和作用,我们作为学习和理解的笔记,就不去 过多介绍了)

对定长对象PYObject
  • 首先,在python内部,对象都是由 PYObject结构体表示,对象引用则是PyObject*
    我们看一下此结构体的源码:
    PyObject 结构体定义于头文件 object.h ,路径为 Include/object.h
typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;
} PyObject;
  • _PyObject_HEAD_EXTRA 宏,结构体包含以下两个字段

    • 引用计数 ( ob_refcnt ):用于垃圾回收机制,当对象被引用,值加一,引用解除,减一。当引用计数变为零。
    • 类型指针 ( ob_type ):指向对象的类型对象, 类型对象描述实例对象的 数据及行为(记住这句话,后面介绍)
  • 回过头来看 _PyObject_HEAD_EXTRA 宏的定义,同样在 Include/object.h 头文件内:

#ifdef Py_TRACE_REFS
/* Define pointers to support a doubly-linked list of all live heap objects. */
#define _PyObject_HEAD_EXTRA            \
    struct _object *_ob_next;           \
    struct _object *_ob_prev;

#define _PyObject_EXTRA_INIT 0, 0,

#else
#define _PyObject_HEAD_EXTRA
#define _PyObject_EXTRA_INIT
#endif

我们观察可以发现:

struct _object *_ob_next;
struct _object *_ob_prev;

这两个指针,正是用来实现双向链表的!!,也就是说,复杂的对象室友结构体以及 链表进行连接表示的(后面会有图片理解)

书中原话:
结合注释,双向链表用于跟踪所有 活跃堆对象 ,一般不启用,不深入介绍。


对变长对象:PYVarObject:
typedef struct {
    PyObject ob_base;
    Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;

观察可以知道:变长对象比普通对象多一个字段 ob_size ,用于记录元素个数

如图所示:
在这里插入图片描述

  • 至于具体对象,视其大小是否固定,需要包含头部 PyObject 或 PyVarObject 。所以准备了两个宏定义,方便其他对象调用:
#define PyObject_HEAD          PyObject ob_base;
#define PyObject_VAR_HEAD      PyVarObject ob_base;
  • 下面是具体的例子,用来理解构造对象:
  • (1)浮点对象(上节中提到了是定长对象)
typedef struct {
    PyObject_HEAD  // 调用上面的宏定义

    double ob_fval;  // 用一个 双精度浮点数 double 加以实现:
} PyFloatObject;

在这里插入图片描述

  • (2)对于列表(变长对象)
typedef struct {
    PyObject_VAR_HEAD  // 使用带ob_size的变长头部

    PyObject **ob_item;
    Py_ssize_t allocated;
} PyListObject;

在这里插入图片描述
可以看出来: PyListObject 底层由一个数组实现,而数组中存储的 明显是对象的指针
ob_item: 指向 动态数组 的指针,数组保存元素对象指针;
allocated: 动态数组总长度,即列表当前的 容量 ;
ob_size: 当前元素个数,即列表当前的 长度 ;
(列表容量不足时, Python 会自动扩容,具体做法书中会在讲解 list 源码时再详细介绍)

  • 最后是说明两个新的用于初始化对象头部的宏定义。(到现在已经提到 还几个关于头部定义的东西,不要迷,搞清楚,他们都是最开始的两个的宏定义,方便使用,后续都是使用下面的两个宏定义,用于初始化头部)

    • PyObject_HEAD_INIT 一般用于 定长对象 ,将引用计数 ob_refcnt 设置为 1 并将对象类型 ob_type 设置成给定类型:
#define PyObject_HEAD_INIT(type)        \
    { _PyObject_EXTRA_INIT              \
    1, type },
  • PyVarObject_HEAD_INIT 在 PyObject_HEAD_INIT 基础上进一步设置 长度字段 ob_size ,用于 变长对象
#define PyVarObject_HEAD_INIT(type, size)       \
    { PyObject_HEAD_INIT(type) size },

( 后续都会使用到这两个宏定义,会加深理解 )

总结:Python 中所有对象共有的信息。 对于内存中的任一个对象,不管是何类型,它刚开始几个字段肯定符合我们的预期: 1. 引用计数 、 2. 类型指针 以及变长对象特有的 (3)元素个数

PYTypeObject, 类型基石
下面就是引申书中的问题:
  1. 不同类型的对象所需内存空间不同,创建对象时从哪得知内存信息呢?
  2. 对于给定对象,怎么判断它支持什么操作呢?(上文让记住的地方)
  • 这就是上面提到的 ob_type字段。
    • 对象所支持的操作和 创建他的信息,其实都包含在它的类型中!!。也就是ob_type所指向的类型对象。
    • ob_type所指向的是 类型对象 PyTypeObject:,在 Include/object.h 中定义(只讨论关键字段)对象的 元信息(元数据)
typedef struct _typeobject {
    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 */
    destructor tp_dealloc;
    printfunc tp_print;

    getattrfunc tp_getattr;
    setattrfunc tp_setattr;

    // ...
    /* Attribute descriptor and subclassing stuff */
    struct _typeobject *tp_base;

    // ......
} PyTypeObject;
  • 首先我们知道 类型对象 PYTypeObject 是一个 变长对象, 包含在对象头部。
  • 部分字段:
    • 类型名字:既 tp_name字段
    • 类型的继承信息,例如 tp_base 字段指向基类对象
    • 创建实例对象时所需的 内存信息 ,即 tp_basicsize 和 tp_itemsize 字段
    • 该类型支持的相关 操作信息!! ,即 tp_print 、 tp_getattr 等函数指针;(阅读过python官方文档就知道getattr这些方法,在这里明白在c中的定义,显得格外清晰)

书作者的话:
PyTypeObject 就是 类型对象 在 Python 中的表现形式,对应着面向对象中“类”的概念。 PyTypeObject 结构很复杂,但是我们不必在此刻完全弄懂它。 先有个大概的印象,知道 PyTypeObject 保存着对象的 元信息 ,描述对象的 类型 即可

  • 以浮点类型为例,考察 类型对象 和 实例对象 在内存中的形态和关系
>>> float
<class 'float'>
>>> pi = 3.14
>>> e = 2.71
>>> type(pi) is float
True

代码中各个对象在内存的形式如下图所示:
(这就是涉及到上节提到的,变量只是一个名字!,float也一样,不过是指向了浮点数类型对象)
在这里插入图片描述
其中,两个浮点 实例对象 都是 PyFloatObject 结构体, 除了公共头部字段 ob_refcnt 和 ob_type ,专有字段 ob_fval 保存了对应的数值。 浮点 类型对象 是一个 PyTypeObject 结构体, 保存了类型名、内存分配信息以及浮点相关操作。 实例对象 ob_type 字段指向类型对象, Python 据此判断对象类型, 进而获悉关于对象的元信息,如操作方法等。 再次提一遍,float 、 pi 以及 e 等变量只是一个指向实际对象的指针。

  • 由于浮点类型对象全局唯一,所以再C语言层面上,作为一个全局静态定义。

在这里插入图片描述
注意到 ob_type 指针指向 PyType_Type ,这也是一个静态定义的全局变量。 由此可见,代表“ 类型的类型 ” 即 type 的那个对象应该就是 PyType_Type 了!!!!

  • 上节中我们知道,类,也就是类型对象,也有自己的类型,也就是 type:
  • 在C语言中:type的肉身为:PyType_Type ,Object/typeobject.c 中定义
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 */

    // ...
    (reprfunc)type_repr,                        /* tp_repr */

    // ...
};
  • 要知道:内建类型和自定义类对应的 PyTypeObject 对象都是这个通过 PyType_Type 创建的!
  • PyType_Type 在 Python 的类型机制中是一个至关重要的对象,它是所有类型的类型,称为 元类型 ( meta class )!! 深入到源码里讲这些,你是否对元类,以及 type有了更深的理解? 哈哈!
  • 另外:第二行,PyType_Type 将自己的 ob_type 字段设置成它自己(第 2 行),这就解释了之前的 type的类型还是 type!
>>> type.__class__
<class 'type'>
>>> type.__class__ is type
True

到这里,我们对 元类型type在对象体系中的位置就非常清晰了!
在这里插入图片描述

再对类型清楚之后,我们就要说下面的 基类: object
PyBaseObject_Type,类型之基
  • 上节里知道:object 是另一个特殊的类型,它是所有类型的基类,我们可以在 PyFloat_Type 中 tp_base 字段找到它!
  • PyBaseObject_Type 就是 object 背后的实体:
PyTypeObject PyBaseObject_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "object",                                   /* tp_name */
    sizeof(PyObject),                           /* tp_basicsize */
    0,                                          /* tp_itemsize */
    object_dealloc,                             /* tp_dealloc */

    // ...
    object_repr,                                /* tp_repr */
};
  • 这里注意: ob_type 字段指向 PyType_Type 跟 object 在 Python 中的行为时相吻合的! object的 类型也是 type!
>>> object.__class__
<class 'type'>
  • 又注意到 PyType_Ready 函数初始化 PyBaseObject_Type 时,不设置 tp_base 字段。 因为继承链必须有一个终点,不然对象沿着继承链进行属性查找时便陷入死循环(解释上节提到得object继承死循环)
>>> print(object.__base__)
None
现在就已经全部清楚了,并且解释清楚了 object, 类型(class),type三者的关系!

如图:
在这里插入图片描述

总结: 我们在这里,把上节提到的 不同类型的对象,还有实例对象,类型,type,object,都通过源码明白了过来! 理解起来不再是靠死记硬背,真心喜欢这个老师出的这本书!讲解的非常细致,并且易于理解。并且,看不是目的,一定要理解原理,不能死记笔记。

【CAN通讯系列9】揭开波特率的神秘面纱 就这么一个小小功能的解析,其实已经包含了从基本原理到软件实现,再到实际应用,后续继续以这种思路,解析更多CAN通讯内容,欢迎持续关注。已经详细介绍了波特率,CAN位时间,同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),采样点等概念。然后,要设置的波特率为500Kbps,换算时间表示则为1/500 Kbps =2000ns。如果CAN位时间为24个tq,那么tq=83.33ns,tq不为整数,也不成立!综上,就可以确定CAN位时间应为8个tq,tq=250ns,取。 阅读详情

相关推荐

揭开LiteOS的神秘面纱

“2015年5月20日,在2015华为网络大会上,华为发布了敏捷网络3.0,主要包括最轻量级的物联网操作系统LiteOS、敏捷物联网关、敏捷控制器三部分。华为战略Marketing总裁徐文伟介绍,LiteOS体积只有10KB级,而且实行开源,使智能硬件开发变得更加简单。”     上面这段话摘自百度百科,针对于LiteOS,其中的“最轻量”、“10KB级”、“开源”、“智能硬件开发变得简单”

华为开发者社区的博客 9658

Python源码学习-PyTypeObject

重点学习下一个数据结构 PyTypeObject PyType_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "type", /* tp_name */ sizeof(PyHeapTypeObject),

robin的专栏 2428

揭开内核的神秘面紗 - 我们究竟在调什么?

《Linux内核调优入门指南》摘要:本文揭示了Linux内核调优的核心原理,将内核比作管理硬件资源的"大管家"。作者强调调优不是盲目追求性能提升,而是根据业务类型(CPU/内存/磁盘/网络密集型)寻找平衡点。文章介绍了两个关键工具:sysctl命令用于临时调整参数,/etc/sysctl.conf文件实现永久配置,并通过实操演示vm.swappiness参数的修改过程。最后指出,理解业务负载特性比简单复制参数更有价值,为后续深入CPU调优等内容奠定基础。(150字)

weixin_42587823的博客 8585

Python对象初探

数据结构 PyObject_HEAD //对象公共头部 Py_ssize_t ob_refcnt; //对象引用数 PyTypeObject *ob_type; //对象类型 PyObject_VAR_HEAD //这个就是属于可变对象头部啦 PyObject_HEAD //对象头部 Py_ssize_t ob_size;//元素个数 展开了就是 ...

weixin_30933531的博客 188

小伙伴们-GO-带你揭开Linux的神秘面纱

小伙伴们-GO-带你揭开Linux的神秘面纱 带你了解Linux操作系统优秀特质,一探Linux系统-满血复活的启动过程。解刨Linux 骨架-文件系统与目录结构 讲解它硬盘存储的秘密知识

fyydlz的博客 5410

给STM32F103的7寸屏找个新UI:LVGL 8.2裸机移植保姆级教程(附避坑清单)

本文详细介绍了如何将LVGL 8.2裸机移植到STM32F103开发板,特别针对7寸大屏(800×480分辨率)进行优化配置。从环境准备、工程搭建到显示驱动移植、内存优化与性能调优,提供完整的解决方案和避坑清单,帮助开发者快速实现美观的用户界面。

weixin_29181861的博客 413

使用C/C++编写Python扩展库

转载:http://kipway.com/kipway_python_ext.html 本文描述在Windows系统下(Linux下也一样,官方文档本来就没有区分系统)使用C/C++编写Python3扩展库的方法,Python Extending 的官方文档在这里(Extending and Embedding the Python Interpreter)。下面主要讲原理,有描述不清楚的请参...

Dashi_Lu的博客 1634

OpenManus本地部署实战:从源码编译到浏览器路径优化全解析

本文详细解析了OpenManus本地部署的全过程,从源码编译到浏览器路径优化。涵盖环境准备、源码获取、模型配置、依赖安装等关键步骤,特别针对Windows系统下的chrome.exe路径修改提供了实用解决方案,帮助开发者高效完成部署并优化性能。

weixin_28826545的博客 378

Python源码剖析 - Python中的整数对象

1. 不可变的PyIntObject Python源码剖析 - 对象初探 我们对 PyIntObject 已经有了初步的了解。 Python 中的对象可以分为固定长度和可变长度两种类型。除此之外,也可以按照可变和不可变进行划分。 PyIntObject 则属于长度固定且不可变的对象。相比其他的对象而言,最简单,也最容易理解。 我们先来了解一下 PyIntObject 类型的类型信息,代码如下: ...

xtuz666的博客 315

从零开始学嵌入式之STM32——1.什么是STM32

它是ST公司推出的一系列单片机的统称。ST----指的是ST公司----意法半导体。意法半导体,成立于1987年,是由意大利的SGS微电子公司和法国的Thomson半导体公司合并而成。ARM目前主要是ARM架构处理器及外围组件的电路设计方案,知识产权授权的形式收取费用,其他公司根据ARM的方案设计出CPU产品。,它以应用为核心,软硬件可裁剪,旨在实现对设备的控制、监测或辅助功能,区别于通用计算机(如 PC、服务器)的 “一机多用” 属性。在嵌入式领域,目前主流的是cortex-M3内核推出的芯片。

qshdyy的博客 1853

mmpretrain学习笔记

(4)数据集路径 data_root=‘data/imagenet’–》data_root=‘data/Fruits Dataset/images’(7)适当的修改num_workers、epochs、batch_size、lr等。3、训练优化 :梯度下降算法、学习率参数、训练总轮次、学习率变化策略等。my_resnet18_8xb32_in1k.py 完整的配置文件。(6)split=‘train’、split='val’注释掉。2、数据:数据集划分、数据文件路径、批大小、数据增强策略等。

吃葡萄不吐葡萄皮 936

揭开计算机运行的神秘面纱:它到底是如何工作的?

现代计算机之父-- ​冯・诺依曼约翰·冯·诺依曼(John vonNeumann,1903年12月28日—1957年2月8日),出生于匈牙利布达佩斯,匈牙利犹太裔美籍数学家、计算机科学家、物理学家和化学家,美国国家科学院院士,生前是普林斯顿高等研究院教授[1]。约翰·冯·诺依曼早期从事算子理论、共振论、量子理论、集合论等方面的研究,后期转向研究自动机理论研究 [6]。指令是带有指示性、要求特定动作或操作的命令、指示或信号。指定本身也是一个数字,用二进制形式保存在内存的某个区域内。

2301_80543957的博客 2355

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3186

揭开智能体的神秘面纱:原来你不是“超级AI“!

【揭秘AI智能体:大模型+工具=超级助手】智能体并非新一代AI模型,而是大语言模型(如GPT-4)与工具函数的巧妙结合。通过Function Calling技术,智能体能够自主调用工具完成实际任务,如文件操作、网络搜索等。相比传统AI只能提供建议,智能体实现了"大脑+双手"的协作模式,使其从理论建议者升级为实操执行者。这一架构创新让AI从"纸上谈兵"变为真正可用的助手,展现了"简单而有效"的设计智慧。

weixin_42657666的博客 812

PCIE总线及其PCIE SWITCH的使用

PCIe总线与PCI最大的区别在工作原理上,PCIe是采用点到点的串行方式进行传输的,被称为“串行PCI”,由于采用了串行方式传输使得其工作频率可以达到2.5Ghz,大大增加了传输速率,同时采用全双工的通信方式,使得其传输速度提高了一倍,每一个PCIe总线设备与外部通信时有四根数据总线,分别有两个RX和TX,两根用于发送,两根由于接收。PCIe switch中文翻译为PCIe开关或PCIe交换机,主要作用将PCIe设备互联,PCIe switch芯片与其设备的通信协议都是PCIe;

zxm8513优快云博客 4733

Imagiq AI-PQ 图像质量增强模块详解:联发科 ISP 中的 AI 图像管线实战解析

随着智能手机影像系统对图像质量要求的持续提升,联发科在其 Imagiq ISP 中引入了 AI 驱动的图像增强模块——AI-PQ(AI-based Picture Quality),通过 AI 模型对亮度、色彩、噪声、锐度等多个维度进行动态调节与增强,实现更加智能化和个性化的图像输出效果。AI-PQ 在实际工程中已成为影响照片风格、视频观感和多模组一致性的核心能力之一。本文围绕 Imagiq 平台最新一代 AI-PQ 模块(2024-2025年量产平台为基础),结合实机开发与调优经验,深入剖析其各子模块的算

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1417

揭开人工智能中 Tokens 的神秘面纱

简单来说,tokens 是将文本分割成的一个个基本单元。当我们输入一段文字时,人工智能模型不会将其视为一个连续的整体,而是会把它拆分成更小的部分,这些部分就是 tokens。例如,对于句子 "The cat is on the mat",常见的分词方式可能会将其拆分为 ["The", "cat", "is", "on", "the", "mat"] 这 6 个 tokens。这种拆分并非随意为之,其背后有着特定的目的和规则。在更复杂的情况下,一些模型可能会把单词进一步细分为子词(sub - words)

qq_73376107的博客 3127

手把手教你学veriolg(二十六)-- Verilog CIC 滤波器设计

目录 Verilog CIC 滤波器设计1. CIC 滤波器的基本原理2. Verilog 实现3. 说明4. 测试激励5. 总结 CIC(Cascade-Integrator-Comb)滤波器是一种特殊的数字滤波器,常用于多速率信号处理中,尤其是用于信号的上采样(插值)和下采样(抽取)。CIC 滤波器的特点在于它具有简单的硬件实现、不需要乘法器(仅使用加法器和延迟元件)、且具有线性相位特性。然而,CIC 滤波器的缺点是它会产生较大的量化误差,因此在设计时需要特别注意字长的选择以避免溢出。1. CIC 滤波

MHD0815的博客 888

【亲测免费】 深度探索C++对象模型:揭开编程语言的神秘面纱

深度探索C++对象模型:揭开编程语言的神秘面纱 【下载地址】深度探索C对象模型PDF 深度探索C++对象模型 PDF欢迎来到《深度探索C++对象模型》PDF资源页面 项目地址: https://gitcode.com/open-s...

gitblog_09757的博客 496

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

揭开5G的神秘面纱

揭开5G的神秘面纱前言一、移动通信的历程 前言 近年来,5G(第五代移动通信技术)受到了人们的广泛关注。自20世纪80年代起,移动通信技术不断发展,一代又一代的新型通信技术应运而生。5G作为最新一代的蜂窝移动通信技术正逐步走入我们的日常生活,然而什么是5G技术?5G和4G有什么区别?5G能给社会带来什么便利?下面就为大家揭开5G的神秘面纱。 一、移动通信的历程 ...

王大雏的博客 3万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python爬虫:揭开淘宝商品描述的神秘面纱

你是否曾在浏览淘宝时,对那些神秘的商品描述充满了好奇?作为一名追求真相的程序员,我们怎能忍受这种未知?是时候展示真正的技术了——用Python编写一个爬虫,通过API接口,快速而准确地获取商品描述,让你的购物之旅不再迷茫!

2401_87195067的博客 849

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

宇宙中的神秘访客:揭开奥陌陌与2I/鲍里索夫彗星的神秘面纱

在浩瀚无垠的宇宙中,我们的太阳系仿佛一叶扁舟,在无尽的星际海洋中漂泊。在这片神秘莫测的宇宙空间里,不时会有来自遥远星系的访客悄然降临,它们的出现总能激起我们内心深处对未知世界的无尽渴望。今天,就让我们一起踏上这场探索之旅,揭开两个特殊访客的神秘面纱:奥陌陌(Oumuamua)和2I/鲍里索夫彗星(Comet 2I/Borisov)。

sunxinhere的专栏 1199

Python爬虫:揭开店铺详情的神秘面纱

你是否曾在浏览电商平台时,对那些神秘的店铺充满了好奇?作为一名追求真相的程序员,我们怎能忍受这种未知?是时候展示真正的技术了——用Python编写一个爬虫,通过API接口,快速而准确地获取店铺详情,让你的好奇心得到满足!

2401_87849163的博客 971

揭开均线系统的神秘面纱_揭开动态规划的神秘面纱

揭开均线系统的神秘面纱by Prajwal M 通过Prajwal M There are many quality articles on how to become a software developer. They teach you to program, develop, and use libraries. But little has been done to educate i...

869

揭开J2ME平台的神秘面纱

      做J2ME应用开发的程序员也许经常会被一些名词或者概念所迷惑,比如Personal Basic Profile和Personal Profile有什么关系?基于CLDC的应用程序能够无修改的移植到基于CDC的设备上嘛?要回答这些问题并不容易,因为你必须首先揭开J2ME平台的神秘面纱。       2000年当J2ME平台的CLDC发布的时候,所有的java开发者都为之兴奋不已。SUN也

mingjava的专栏 1万+

从零开始学编译原理:揭开代码翻译的神秘面纱

在计算机科学的广阔天地里,编译原理犹如一座神秘的宝藏,它是连接人类智慧与机器语言的关键纽带,默默支撑着整个软件世界的运转。对于渴望深入探索计算机底层奥秘的学习者来说,从零开始学习编译原理,不仅能揭开代码翻译的神秘面纱,更能为编程之路打下坚实的基础。接下来,就让我们一起踏上这场充满挑战与惊喜的学习之旅。

wjy__wjy_的博客 891
上一篇: 第二章对象模型(1)
下一篇: 第二章对象模型(3):从创建到销毁,对象的生命周期
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值