类与对象——PyObject

面向对象的Python

Python是一门面向对象的编程语言,而用于实现Python的C并不是面向对象的语言,这就意味着需要在C层面实现面向对象的特性。

可以参考从C++对象模型谈C语言的继承与多态了解C语言如何实现继承和多态。

Python实现了完全的面向对象的语言特性,所有的类均继承自object基类,对应着实现层面的PyObject。为了实现多态的特性,Python的实现过程维护了一个类型对象系统,用来记录类型信息和维护类的函数成员。

对象和类型对象——Object & type object

对象

  • 对象(类型对象除外)是分配在(heap)上的结构,使用引用计数等方法进行垃圾回收;创建后的对象大小和位置不再变化,可变对象维护一个指向可变部分的指针。
  • 对象(类型对象除外)永远不会被静态分配或者分配在栈上,必须只能通过特殊宏或函数来访问。
    object是Python中所有对象的基类,对应实现中的PyObject结构体

PyObject

// include/object.h
typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;
} PyObject;

_PyObject_HEAD_EXTRA宏在Release版本中定义为空,Py_ssize_t是一个根据平台可变的int类型。PyObject的实际定义如下

// include/object.h
typedef struct _object {
    int ob_refcnt;
    struct _typeobject *ob_type;
} PyObject;

可以看到,在PyObject中只包含内存管理用的引用计数管理对象类型和行为的对象类型指针

对于变长的对象

// include/object.h
typedef struct {
    PyObject ob_base;
    Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;

在PyObject的基础上增加了一个记录变长部分元素个数的属性。

类型对象

类型对象一般是全局变量,每个类型会实例化一个类型对象,用来记录该类型的信息。

// include/object.h
typedef struct _typeobject {
    PyVarObject ob_base;
    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;
	.....
} PyTypeObject;
  • _typeobject第一个字段为PyVarObject(可以看做_typeobject继承自PyVarObject)
  • tp_name,打印类型名字
  • tp_basesizetp_itemsize,创建对象是分配内存空间信息
  • 剩下的是一些操纵该对象的函数

对象的构造

每个内建类型都会有一个PyXXX_New的函数来构造对象,主要分为内存分配和初始化两个过程,

  • 内存分配:分配对象的固定内存+可变部分的内存
  • 初始化:refcnt = 1; ob_type = PyXXX_Type; ob_size = size;
    针对不同的类型,会对内存分配和构造过程进行特化。

注:
python3后整型只会维护一个int型(python2有intlong两种)

int (signed integers) − They are often called just integers or ints. They are positive or negative whole numbers with no decimal point. Integers in Python 3 are of unlimited size. Python 2 has two integer types - int and long. There is no ‘long integer’ in Python 3 anymore.

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值