Python Object

前言: 在 Python 的世界中,一切皆是对象!

  • 类型对象(type object) v.s. 实例对象(instance object)

一个整数是一个对象,一个字符串也是一个对象。更为奇妙的是,类型 也是一种对象,整数类型是一个对象,字符串类型也是一个对象。这些类型对象实现了面向对象中 的概念; 这些类型对象通过 实例化 ,可以创建出相应类型对象的实例对象。
比如,int a = 3. 那么 int 就是类型对象, a 就是实例对象。

例如,int 类型 是type类的对象。

>>> int.__class__

  • Python 内的对象

在 Python 中,对象就是为 C 中的结构体在堆上申请的一快内存。一般来说,对象是不能被静态初始化的,并且也不能在栈空间上生存。唯一的例外就是 类型对象 , Python 中所有的内建的类型对象都是被静态初始化的。

  • PyObject and PyVarObject
    Python-3.6.2 原码中的 object.h 中有其定义:
#define PyObject_HEAD                   PyObject ob_base;
... ...
#define PyObject_VAR_HEAD      PyVarObject ob_base;
... ...
typedef struct _object {
    _PyObject_HEAD_EXTRA        #有可能为空: #define _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;
} PyObject;

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

PyObject: In a normal “release” build, it contains only the object’s reference count(ob_refcnt) and a pointer to the corresponding type object(ob_type).
An object has a 'reference count' that is increased or decreased when a
pointer to the object is copied or deleted; when the reference count
reaches zero there are no references to the object left and it can be
removed from the heap.
An object has a 'type' that determines what it represents and what kind
of data it contains. An object's type is fixed when it is created.
Types themselves are represented as objects; an object contains a
pointer to the corresponding type object. The type itself has a type
pointer pointing to the object representing the type 'type', which
contains a pointer to itself!.

read more: PyObject

  • 类型的类型
>>> int.__class__

>>> object.__class__

>>> type.__class__

没错,这个一再出现的 就是 Python 内部的 PyType_Type,它就是 class 的 class,所以它在 Python 中被称为 metaclass.

你可能感兴趣的:(Python Object)