美文网首页IT狗工作室
第6篇:Cython的面向对象编程--扩展类的实例化

第6篇:Cython的面向对象编程--扩展类的实例化

作者: 铁甲万能狗 | 来源:发表于2020-04-22 20:50 被阅读0次

我们前篇谈到了Cython的访问控制,并且谈论了cdef class关键字的底层操作,顺带也谈论了Python类为什么会比Cython类慢的原因。本篇我们将介绍Cython扩展类的初始化

Cython扩展类实例实例化,C的运行时系统在内存中都为其实例持有一个C结构体的内存区域,对于对象的创建和初始化,当Python调用__ init __时,self参数必须是该扩展类型的有效实例,当调用 __ init __时,通常使用来自参数来初始化类实例属性,但在C底层,在调用 __ init __之前,必须为其扩展类型的实例分配内存,并且结构体的字段都必须处于有效状态。

__ cinit __和__dealloc __方法

__ cinit__是负责执行C级别的类实例属性(指针类型)的内存分配和初始化,并且在外部代码的执行结束前,Cython编译器会默认隐含调用扩展类实例的 __ dealloc __方法,这些行为和C++编译器是一致。

  • __ cinit__等同C++类中默认构造函数
  • __ dealloc__ 等同于C++类的析构函数

使用__ cinit__的注意事项

  • __ cinit__可能会带来额外的开销
  • __ cinit__的参数声明和__ init__必须一致,因为它们会被同时调用,因此__ cinit__的参数会留下kargs,*kwargs
  • __ cinit__中涉及到C指针类型的类属性的内存分配,必须在类定中显式定义__ dealloc__,因为需要通过__ dealloc __对C指针类型的实例属性进行内存释放
  • __ cinit__和__ init __只能使用def关键字申明

我们通过一些例子来列举使用 __ cinit 的情况,下面的是一个Cython扩展类Fruit,在C级别的扩展类,若定义了C指针类型的类属性,在 cinit__方法内完成C类型的类实例属性的初始化和内存分配,是其主要的用途

from libc.stdlib cimport malloc,free

cdef class Fruit(object):
    '''Fruit Type'''
    
    cdef readonly str name
    cdef public double qty
    cdef readonly double price
    cdef double *weight
    
    def __cinit__(self,nm,qt,pc):
        print("__cinit__ method executed")
        self.name=nm
        self.qty=qt
        self.price=pc
        self.weight=<double*>malloc(sizeof(double))
        self.weight[0]=23.33
        
        print("weight: ",self.weight[0])
        
    def __init__(self,nm,qt,pc):
        print("__init__ method executed")

    def amount(self):
        return  self.qty*self.price
    
    def __dealloc__(self):
        print("__dealloc__method executed")
        
        if self.weight!=NULL:
            free(self.weight)

调用代码

#!/usr/bin/python3

import pyximport
pyximport.install()

import cy_fruit
if __name__=='__main__':

    b=cy_fruit.Fruit("banana",23.0,33.0)
    b.amount()
    

Cython扩展类在构造时会保证__ cinit__只能被调用一次,并且在__ init__,__ new__或其他Python级别的构造函数(例如,类方法构造函数)之前被调用, Cython将所有初始化参数传递给 __ cinit __,并在./app.py的Python外部代码在结束之前,隐式调用Fruit类实例b. __ dealloc __

Cython扩展类的快速实例化

更新中....

相关文章

  • 第6篇:Cython的面向对象编程--扩展类的实例化

    我们前篇谈到了Cython的访问控制,并且谈论了cdef class关键字的底层操作,顺带也谈论了Python类为...

  • 什么叫实例化

    实例化是指在面向对象的编程中,通常把用类创建对象的过程称为实例化。 就是用日期类创建了一个日期的对象,就叫对象的实...

  • 工厂模式

    工厂模式 每次用new来实例化对象的时候,都是实例化具体的类,不是面向接口编程,而是实现;代码绑着具体类会导致代码...

  • python 面向对象的编程(一)

    python 同时支持面向对象编程和函数式编程的语言python面向对象的主题围绕 类 和 类实例 两个主题。面向...

  • python面向对象编程(1)|类和对象

    从今天开始我们来学习python面向对象编程,所谓面向对象编程,我个人认为就是把一类事物封装起来然后实例化对象对类...

  • IO 流中,inputstream能不能new

    一、什么样的类不能被实例化 接口抽象类构造方法的访问权限为私有 二、实例化 实例化是指在面向对象的编程中,通常把用...

  • 知识整理NO.4-#迭代器模式Iterator

    迭代器模式Iterator 背景 概述 类中的面向对象编程封装应用逻辑。类,就是实例化的对象,每个单独的对象都有一...

  • 实例化对象

    在面向对象的编程中,通常把用类创建对象的过程称为实例化,其格式如下: 类名 对象名 = new 类名(参数1,参数...

  • 面向对象思想:对象,实例和实例化(Java表述)

    字数:2402 阅读时长:5 min 面向对象思想:对象,实例和实例化(Java表述) 面向对象编程(Object...

  • 第六段 理解属性这一概念

    什么是对象? 类的实例化。 什么是类? 具有相同事物特征的统称。 对象是面向对象编程的基本构造单元。对象可以存储并...

网友评论

    本文标题:第6篇:Cython的面向对象编程--扩展类的实例化

    本文链接:https://www.haomeiwen.com/subject/idlbihtx.html