Python 对象的基石 PyObject

本文基于《Python源码剖析》探讨PyObject,它是所有Python对象的基础。PyObject包含ob_refcnt(引用计数)和ob_type(对象类型),用于垃圾回收和实现多态。ob_refcnt确保对象在引用为0时被正确释放,而ob_type则指向对象的_typeobject,定义了对象的行为和协议。PyObject这种设计在C语言中模拟了面向对象的概念。
摘要由CSDN通过智能技术生成

本系列文章都是基于陈儒的Python源码剖析一书。

打开object.h 文件

typedef struct _object {
        PyObject_HEAD
} PyObject;

上述代码定义了一个数据类型PyObject. 可以发现PyObject中就是PyObject_HEAD。

#define PyObject_HEAD                   \
        _PyObject_HEAD_EXTRA            \
        Py_ssize_t ob_refcnt;           \
        struct _typeobject *ob_type;

可以发现 PyObject_HEAD 是一个宏定义。其中 _PyObject_HEAD_EXTRA也是一个宏定义。

#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

在release编译模式下 Py_TRACE_REFS 是没有被定义的。所以根据条件编译的结果来说

_PyObject_HEAD_EXTRA 为空。所以PyObject可以表述为下面形式:


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python可以通过扩展模块来调用C++的类对象。具体的实现方法包括以下几个步骤: 1. 编写C++类及其方法,并将其编译为动态链接库(DLL)或共享库(SO)。 2. 使用Python的C API,即Python提供的C语言接口,来调用C++库中的类和方法。 3. 在Python中编写扩展模块,将C++类和方法封装成Python可调用的函数和对象。 下面是一个简单的示例代码,演示了如何在Python中调用C++的类和方法: ```c++ // MyClass.h class MyClass { public: MyClass(int x); int getX(); private: int x_; }; // MyClass.cpp MyClass::MyClass(int x) : x_(x) {} int MyClass::getX() { return x_; } ``` ```python // mymodule.cpp #include <Python.h> #include "MyClass.h" static PyObject* createObject(PyObject* self, PyObject* args) { int x; if (!PyArg_ParseTuple(args, "i", &x)) { return NULL; } MyClass* obj = new MyClass(x); return PyCapsule_New(obj, "MyClass", NULL); } static PyObject* getX(PyObject* self, PyObject* args) { PyObject* obj_capsule; if (!PyArg_ParseTuple(args, "O", &obj_capsule)) { return NULL; } MyClass* obj = (MyClass*)PyCapsule_GetPointer(obj_capsule, "MyClass"); int x = obj->getX(); return PyLong_FromLong(x); } static PyMethodDef mymodule_methods[] = { {"createObject", createObject, METH_VARARGS, "Create a new MyClass object."}, {"getX", getX, METH_VARARGS, "Get the x value of a MyClass object."}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef mymodule_module = { PyModuleDef_HEAD_INIT, "mymodule", "A Python module that wraps a C++ class.", -1, mymodule_methods }; PyMODINIT_FUNC PyInit_mymodule(void) { return PyModule_Create(&mymodule_module); } ``` 使用g++编译上述代码: ``` g++ -shared -fPIC MyClass.cpp mymodule.cpp -o mymodule.so -I/usr/include/python3.6m -lpython3.6m ``` 然后在Python中就可以调用MyClass对象了: ```python import mymodule obj = mymodule.createObject(42) x = mymodule.getX(obj) print(x) # 输出: 42 ``` 这是一个简单的示例,实际的应用中可能需要更加复杂的数据类型和方法。需要注意的是,C++代码和Python代码之间的数据转换可能比较繁琐,需要仔细处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值