c语言编程笔录

首页 >   > 笔记大全

笔记大全

自定义python扩展类型 python常用的扩展模块

更新时间:2023-07-14

自定义Python扩展类型

Python的扩展类型是通过C语言编写的,可以通过Python C API扩展实现。Python的扩展类型通常由两个结构体定义,一个是对象结构体,用于定义Python对象模型的实例对象,另一个结构体是类型结构体,用于定义扩展类型的属性和方法。

下面是一个例子,展示如何定义一个扩展类型:


#include <Python.h>

/* 定义一个类型结构体 */
typedef struct {
    PyObject_HEAD
    PyObject *name;
    int age;
} Cat;

/* 定义一个实例对象的结构体 */
typedef struct {
    PyObject_HEAD
    Cat *cat;
} CatObject;

/* 定义Cat的构造函数 */
static PyObject *
Cat_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
    CatObject *self;
    self = (CatObject *)type->tp_alloc(type, 0);
    if (self != NULL) {
        self->cat = (Cat *)malloc(sizeof(Cat));
    }
    return (PyObject *)self;
}

/* 定义Cat的析构函数 */
static void
Cat_dealloc(CatObject *self)
{
    free(self->cat);
    Py_TYPE(self)->tp_free((PyObject *)self);
}

/* 定义Cat的属性和方法 */
static PyMemberDef Cat_members[] = {
    {"name", T_OBJECT_EX, offsetof(Cat, name), 0, "Cat's name"},
    {"age", T_INT, offsetof(Cat, age), 0, "Cat's age"},
    {NULL}
};

static PyTypeObject CatType = {
    PyVarObject_HEAD_INIT(NULL, 0)
    "cat.Cat",/* 类型对象名称 */
    sizeof(CatObject),/* 实例对象大小 */
    0,
    (destructor)Cat_dealloc,/* 析构函数 */
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    (newfunc)Cat_new,/* 构造函数 */
    0,
    0,
    0,
    0,
    Py_TPFLAGS_DEFAULT,
    "Cat objects",/* 文档字符串 */
    0,
    0,
    0,
    0,
    0,
    0,
    Cat_members,/* 类属性 */
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    (initproc)0,
    0,
    Cat_new/* 对象构造函数 */
};

/* 定义模块初始化函数 */
static PyModuleDef cat_module = {
    PyModuleDef_HEAD_INIT,
    "cat",
    "Module for cat test",
    -1,
    NULL,NULL,NULL,NULL,NULL
};

/* 定义模块初始化函数的实现 */
PyMODINIT_FUNC
PyInit_cat(void)
{
    PyObject *m;
    if (PyType_Ready(&CatType) < 0)
        return NULL;
    m = PyModule_Create(&cat_module);
    if (m == NULL)
        return NULL;
    Py_INCREF(&CatType);
    PyModule_AddObject(m, "Cat", (PyObject *)&CatType);
    return m;
}

Python常用的扩展模块

Python的扩展模块是Python解释器中的一组C语言库,用于扩展Python的功能和性能。Python的扩展模块可以分为两类,一类是标准库,另一类是第三方库。

Python的标准库包含了许多稳定和常用的模块,如os、sys、re等,这些模块都是C语言实现的,提供了许多系统调用和底层API,可以不用安装任何库就可以直接使用。

第三方库是由社区开发的Python扩展模块,通常需要安装。这些第三方库大致可以归类为如下几类:

  1. Web框架,如Django、Flask、Bottle等
  2. 科学计算,如Numpy、Scipy等
  3. 数据处理,如Pandas、Scikit-learn等
  4. 数据库,如Sqlalchemy、Mysql-connector等
  5. 爬虫,如Scrapy、BeautifulSoup、Requests等
  6. 图形界面,如Tk、PyQt、wxPython等
  7. 游戏开发,如Pygame、PyOpenGL等
下面是一些常用的第三方模块的代码示例:
Django

安装Django:


pip install Django

创建一个Django Web应用:


from django.conf import settings
from django.urls import path
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello World!")

urlpatterns = [
    path('hello/', hello),
]

settings.configure()
Numpy

安装Numpy:


pip install numpy

使用Numpy:


import numpy as np

# 创建一个数组
a = np.array([1, 2, 3])
print(a)

# 数组计算
b = np.array([3, 2, 1])
c = a + b
print(c)

# 数组指定移位
d = np.roll(a, 1)
print(d)

代码解释和规范

在Python代码中,注释是非常重要的。注释可以帮助代码维护者了解代码的意图和实现方式,更好地理解代码,这样就可以更轻松地修改和扩展代码。Python使用井号(#)来表示注释。

Python还有一些约定俗成的规范,例如在模块文件的开头使用docstrings来说明模块的功能和使用方法、以小写字母加下划线的形式来命名变量和函数、使用4个空格来缩进等等。

下面是一个简单的示例:


def add_two_numbers(a, b):
    """
    对两个数字求和。

    参数:a - 第一个数字
         b - 第二个数字
    返回值:两个数字的和
    """
    sum = a + b
    return sum

sum = add_two_numbers(2, 3)
print(sum)