1. 程式人生 > >python原始碼解析(二)

python原始碼解析(二)

 一:PyObject

  首先,先來看PyObject在object.h中的定義。

typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;
} PyObject;
#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
typedef struct _typeobject PyTypeObject;
  PyObject物件是一個結構體,是python所有物件的基礎。可以看見結構體中包含三個部分:_PyObject_HEAD_EXTRA、

  Py_ssize_t ob_refcnt、 struct _typeobject *ob_type。

 1、_PyObject_HEAD_EXTRA是一個巨集,它的定義與Py_TRACE_REFS有關,即當編譯時會執行else語句,導致_PyObject_HEAD_EXTRA定義為空;

  2、Py_ssize_t ob_refcnt在編譯時確定為一個整型,是一個引用計數(與python的記憶體管理機制有關);

  3、struct _typeobject *ob_type是一個指向_tyepobject的指標,是一個型別物件。

二:PyTypeObject

 我們再來看看PyTypeObject在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;
    PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)
                                    or tp_reserved (Python 3) */
    reprfunc tp_repr;

    /* Method suites for standard classes */

    PyNumberMethods *tp_as_number;
    PySequenceMethods *tp_as_sequence;
    PyMappingMethods *tp_as_mapping;

    /* More standard operations (here for binary compatibility) */

    hashfunc tp_hash;
    ternaryfunc tp_call;
    reprfunc tp_str;
    getattrofunc tp_getattro;
    setattrofunc tp_setattro;

    /* Functions to access object as input/output buffer */
    PyBufferProcs *tp_as_buffer;

    /* Flags to define presence of optional/expanded features */
    unsigned long tp_flags;

    const char *tp_doc; /* Documentation string */

    /* Assigned meaning in release 2.0 */
    /* call function for all accessible objects */
    traverseproc tp_traverse;

    /* delete references to contained objects */
    inquiry tp_clear;

    /* Assigned meaning in release 2.1 */
    /* rich comparisons */
    richcmpfunc tp_richcompare;

    /* weak reference enabler */
    Py_ssize_t tp_weaklistoffset;

    /* Iterators */
    getiterfunc tp_iter;
    iternextfunc tp_iternext;

    /* Attribute descriptor and subclassing stuff */
    struct PyMethodDef *tp_methods;
    struct PyMemberDef *tp_members;
    struct PyGetSetDef *tp_getset;
    struct _typeobject *tp_base;
    PyObject *tp_dict;
    descrgetfunc tp_descr_get;
    descrsetfunc tp_descr_set;
    Py_ssize_t tp_dictoffset;
    initproc tp_init;
    allocfunc tp_alloc;
    newfunc tp_new;
    freefunc tp_free; /* Low-level free-memory routine */
    inquiry tp_is_gc; /* For PyObject_IS_GC */
    PyObject *tp_bases;
    PyObject *tp_mro; /* method resolution order */
    PyObject *tp_cache;
    PyObject *tp_subclasses;
    PyObject *tp_weaklist;
    destructor tp_del;

    /* Type attribute cache version tag. Added in version 2.6 */
    unsigned int tp_version_tag;

    destructor tp_finalize;

#ifdef COUNT_ALLOCS
    /* these must be last and never explicitly initialized */
    Py_ssize_t tp_allocs;
    Py_ssize_t tp_frees;
    Py_ssize_t tp_maxalloc;
    struct _typeobject *tp_prev;
    struct _typeobject *tp_next;
#endif
} PyTypeObject;
#endif
#define PyObject_VAR_HEAD      PyVarObject ob_base;

  PyTypeObject物件是一個結構體,是一個型別物件。可以看見其中包含很多東西:PyObject_VAR_HEAD、const char *tp_name、Py_ssize_t tp_basicsize, tp_itemsize、還有各種方法、函式、屬性、指標等(關於這部分會慢慢解釋)。

  1、PyObject_VAR_HEAD:是一個巨集,可以看見該巨集定義中包含了包含了PyVarObject物件的定義。

  2、const char *tp_name:指向一個固定char型記憶體的指標,表示型別名(在python內部進行除錯的時候用)

  3、Py_ssize_t tp_basicsize, tp_itemsize:建立該型別物件時分配記憶體空間的大小的資訊(兩個整型資料)

三:PyVarObject

#define PyObject_VAR_HEAD      PyVarObject ob_base;
typedef struct {
    PyObject ob_base;
    Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;

  PyVarObject是一個結構體,表示變長物件(如list、字典、String等物件)。其中包含兩個部分:PyObject ob_base、Py_ssize_t ob_size。

  1、PyObject ob_base:是一個PyObject型的物件。

  2、Py_ssize_t ob_size:是一個整型資料,用來表示變長物件的元素的個數。

四:三者的關係圖


相關推薦

python原始碼解析

 一:PyObject  首先,先來看PyObject在object.h中的定義。typedef struct _object { _PyObject_HEAD_EXTRA Py_ssize_t ob_refcnt; struct _typeobjec

Spring原始碼解析——元件註冊2

    import com.ken.service.BookService; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.

認真的 Netty 原始碼解析

Channel 的 register 操作 經過前面的鋪墊,我們已經具備一定的基礎了,我們開始來把前面學到的內容揉在一起。這節,我們會介紹 register 操作,這一步其實是非常關鍵的,對於我們原始碼分析非常重要。 register 我們從 EchoClient 中的 connect() 方法出發,或者 E

jquery 1.7.2原始碼解析構造jquery物件

構造jquery物件 jQuery物件是一個類陣列物件。 一)建構函式jQuery() 建構函式的7種用法:   1.jQuery(selector [, context ]) 傳入字串引數:檢查該字串是選擇器表示式還是HTML程式碼。如果是選擇器表示式,則遍歷文件查詢匹配的DOM元

java集合原始碼解析--AbstractCollection

今天帶來的是java單列頂層介面的第一個輕量級實現:AbstractCollection 我們直接進入正題,先來看看它的宣告: package java.util; //可以從名字上同樣看到 AbstractCollection 是一個抽象類,所以並不能例項化, //這個類只是作

EventBus原始碼解析—釋出事件和登出流程

1.EventBus原始碼解析(一)—訂閱過程 2.EventBus原始碼解析(二)—釋出事件和登出流程 前言 上一篇部落格已經比較詳細的講解了EventBus的註冊過程,有了上一篇部落格的基礎,其實關於EventBus的原始碼中的其他流程就非常好理解了,尤其是我

Spring原始碼解析:obtainFreshBeanFactory

spring的ApplicationContext容器的初始化流程主要由AbstractApplicationContext類中的refresh方法實現。 而refresh()方法中獲取新工廠的主要是由obtainFreshBeanFactory()實現的,後續的操作均是beanFactoty的進一步處理。

Redis5.0原始碼解析----------連結串列

基於Redis5.0 連結串列提供了高效的節點重排能力, 以及順序性的節點訪問方式, 並且可以通過增刪節點來靈活地調整連結串列的長度 每個連結串列節點使用一個 adlist.h/listNode 結構來表示: //adlist.h - A generic do

ThreadPoolExecutor原始碼解析

1.ThreadPoolExcuter執行例項 首先我們先看如何新建一個ThreadPoolExecutor去執行執行緒。然後深入到原始碼中去看ThreadPoolExecutor裡面使如何運作的。 public class Test { public

redis原始碼解析動態字串sds基本功能函式

1. 簡介   本文繼上文基礎上,分析動態字串的功能函式,位於sds.c。由於函式較多,本篇介紹實現動態變化的基本增刪新建釋放函式。 2. 原始碼分析   sdsHdrSize()函式用於返回sdshdr的大小,主要使用sizeof()函式實現。 /*返回sds

OKHttp 3.10原始碼解析:攔截器鏈

本篇文章我們主要來講解OKhttp的攔截器鏈,攔截器是OKhttp的主要特色之一,通過攔截器鏈,我們可以對request或response資料進行相關處理,我們也可以自定義攔截器interceptor。 上一篇文章中我們講到,不管是OKhttp的同步請求還是非同步請求,都會呼叫RealCal

OkHttp原始碼解析

上一篇講到OkHttp的整體流程,但是裡面有一個很重要的方法getResponseWithInterceptorChain還沒有講到,這個方法裡面包括了整個okHttp最重要的攔截器鏈,所以我們今天來講解一下。 Response getResponseWithI

Java容器——HashMapJava8原始碼解析

在前文中介紹了HashMap中的重要元素,現在萬事俱備,需要刨根問底看看實現了。HashMap的增刪改查,都離不開元素查詢。查詢分兩部分,一是確定元素在table中的下標,二是確定以指定下標元素為首的具體位置。可以抽象理解為二維陣列,第一個通過雜湊函式得來,第二個下標則是連結串列或紅黑樹來得到,下面

python 原始碼解析

為了看懂 python 原始碼 ,特地學了 c++ ,依然看不懂,看了個大概,先留個坑,慢慢填。 先從 python dict 物件開始看起。 python dict 物件  是鍵值對的 一種結構,類似於 java 的hashmap 物件。 dictd 物件 , 每個鍵值對 ,

Yolov2原始碼解析

一、資料集製作 首先是從官網上下載VOC2012資料集,這裡我個人得到是訓練集檔案:VOCtrainval_11-May-2012,為了減輕訓練開銷,我將驗證集作為測試集,通過將Main資料夾下的val.txt改名為test.txt檔案,將資料集製作成hdf5檔案的形式。 import os

RxJava2 原始碼解析

概述 知道源頭(Observable)是如何將資料傳送出去的。 知道終點(Observer)是如何接收到資料的。 何時將源頭和終點關聯起來的 知道執行緒排程是怎麼實現的 知道操作符是怎麼實現的 本篇計劃講解一下4,5. RxJava最強大的莫過

Spark2.3.2原始碼解析: 8. RDD 原始碼解析 textFile 返回的RDD例項是什麼

  本文主要目標是分析RDD的例項物件,到底放了什麼。 從程式碼val textFile = sc.textFile(args(0)) 開始: 直接看textFile 原始碼: 你會發現呼叫的是hadoop的api,通過 hadoopFile 讀取資料,返回一個hadoop

DCGANs原始碼解析

model.py DCGANs大部分都在一個叫做 DCGAN 的 Python 類(class)中(model.py)。像這樣把所有東西都放在一個類中非常有用,因為訓練後中間狀態可以被儲存起來,以便後面使用。 首先讓我們定義生成器和鑑別器(上一篇已經介紹過了

mybatis通用mapper原始碼解析

1.javabean的屬性值生成sql /** * 獲取所有查詢列,如id,name,code... * * @param entityClass * @return */ public static String getAllColumns(C

antd原始碼解析button控制元件的解析

第一節我們看了antd的button原始碼,現在我們用class的常用寫法改造下: import React,{ Component } from "React"; var _classnames2 = require('classnames');