在 Cython 类中,使用 __init__ 和 __cinit__ 有什么区别?

2024-02-19

代码块1使用__init__

%%cython -3
cdef class c:
    cdef:
        int a
        str s
    def __init__(self):
        self.a=1
        self.s="abc"
    def get_vals(self):
        return self.a,self.s
m=c()
print(m.get_vals())

代码块2使用__cinit__

%%cython -3
cdef class c:
    cdef:
        int a
        str s
    def __cinit__(self):  # cinit here
        self.a=1
        self.s="abc"
    def get_vals(self):
        return self.a,self.s
m=c()
print(m.get_vals())
  1. 我测试了这两个代码,并且都运行没有错误。 在这种情况下,使用有什么意义__cinit__代替__init__?

  2. 我看了官方文章,被一句话搞糊涂了:

    如果需要将修改后的参数列表传递给基本类型,则必须在__init__()方法,其中应用调用继承方法的正常规则。

“修改论证”是什么意思?这里,为什么要使用init而不是cinit呢?


主要是关于继承。假设我继承了你的类C:

class D(C):
    def __init__(self):
        pass  # oops forgot to call C.__init__

class E(C):
    def __init__(self):
        super().__init__(self)
        super().__init__(self)  # called it twice

How __init__最终被调用完全取决于继承它的类。请记住,可能存在多层继承。

此外,创建包装 C/C++ 对象的类的一个相当常见的模式是创建staticmethod cdef作为替代构造函数的函数 https://cython.readthedocs.io/en/latest/src/userguide/extension_types.html#existing-pointers-instantiation:

cdef class C:
    def __cinit__(self):
        print("In __cinit__")

    @staticmethod
    cdef make_from_ptr(void* x):
        val = C.__new__(C)
        # do something with pointer
        return val

再次在这种情况下,__init__通常不被调用。

相比之下__cinit__保证被调用一次,并且这由 Cython 在过程的早期阶段自动发生。当您有以下情况时,这是最重要的cdef您的类在初始化时所依赖的属性(例如 C 指针)。 Python 派生类甚至不可能设置这些,但是__cinit__可以确保他们是。

就您而言,这可能并不重要 - 使用您满意的任何一个。


就“修改后的参数”而言,它是说你不能用__cinit__:

class NameValue:
     def __init__(self, name, value):
         self.name = name
         self.value = value

class NamedHelloPlus1(NamedValue):
    def __init__(self, value):
        super().__init__("Hello", value+1)

i.e. NamedHelloPlus1控制什么参数NamedValue得到。和__cinit__Cython 所有调用__cinit__接收完全相同的参数(因为 Cython 安排调用 - 您无法手动调用它)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Cython 类中,使用 __init__ 和 __cinit__ 有什么区别? 的相关文章

  • 如何覆盖 Django 的默认管理模板和布局

    我正在尝试覆盖 Django 的默认模板 现在只有base site html 我正在尝试更改 django 管理文本 我做了以下事情 我在我的应用程序目录中创建了一个文件夹 opt mydjangoapp templates admin
  • 在 Pandas 中,如何从基于另一个数据框的数据框中删除行?

    我有 2 个数据框 一个名为 USERS 另一个名为 EXCLUDE 他们都有一个名为 电子邮件 的字段 基本上 我想删除 USERS 中包含 EXCLUDE 中包含电子邮件的每一行 我该怎么做 您可以使用boolean indexing
  • 字符串中的注释和注释中的字符串

    我正在尝试使用 Python 和 Regex 计算 C 代码中包含的注释中的字符数 但没有成功 我可以先删除字符串以删除字符串中的注释 但这也会删除注释中的字符串 结果会很糟糕 是否有机会通过使用正则表达式来询问不匹配注释中的字符串 反之亦
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • 编辑 Jupyter Notebook 时 VS Code 中缺少“在选择中查找”

    使用 Jupyter Notebook 时 VSCode 中缺少 在选择中查找 按钮 它会减慢开发速度 所以我想请问有人知道如何激活它吗 第一张图显示了在 python 文件中的搜索 替换 第二张图显示了笔记本电脑中缺少的按钮 Python
  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch
  • 如何使用 Bokeh 动态隐藏字形和图例项

    我正在尝试在散景中实现复选框 其中每个复选框应显示 隐藏与其关联的行 我知道可以通过图例来实现这一点 但我希望这种效果同时在两个图中发生 此外 图例也应该更新 在下面的示例中 出现了复选框 但不执行任何操作 我显然不明白如何更新用作源的数据
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 如何在 Azure 数据工厂 - Databricks 中使用 continuation_token 获取 ADF Pipeline 运行详细信息的下一页?

    我在用 adf client pipeline runs query by factory resourceGroupName 工厂名称 过滤器参数 的方法azure mgmt datafactory DataFactoryManageme
  • Python:我不明白 sum() 的完整用法

    当然 我明白你使用 sum 与几个数字 然后它总结所有 但我正在查看它的文档 我发现了这一点 sum iterable start 第二个参数 start 的作用是什么 这太尴尬了 但我似乎无法通过谷歌找到任何示例 并且对于尝试学习该语言的
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • 使用 pybtex 将 bibtex 转换为格式化的 HTML 参考书目,例如哈佛风格

    我正在使用 Django 并将 bibtex 存储在我的模型中 并且希望能够以格式化 HTML 字符串的形式向我的视图传递引用 使其看起来像哈佛引用样式 使用中描述的方法Pybtex 无法识别 bibtex 条目 https stackov
  • Django - 提交具有同一字段多个输入的表单

    预警 我对 Django 以及一般的 Web 开发 非常陌生 我使用 Django 托管一个基于 Web 的 UI 该 UI 将从简短的调查中获取用户输入 通过我用 Python 开发的一些分析来提供输入 然后在 UI 中呈现这些分析的可视
  • 以编程方式使用 Sphinx 特定指令解析 .rst 文件

    我希望能够在 Python 中解析基于 sphinx 的 rst 以便进一步处理和检查 就像是 import sphinx p sphinx parse path to file rst do something with p 似乎在 do
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • 附加两个具有相同列、不同顺序的数据框

    我有两个熊猫数据框 noclickDF DataFrame 0 123 321 0 1543 432 columns click id location clickDF DataFrame 1 123 421 1 1543 436 colu
  • OSX 上的 locale.getlocale() 问题

    我需要获取系统区域设置来执行许多操作 最终我想使用 gettext 翻译我的应用程序 我打算在 Linux 和 OSX 上分发它 但我在 OSX Snow Leopard 上遇到了问题 python Python 2 5 2 r252 60
  • 从列表python的单个列表中删除子列表

    我已经经历过从列表列表中删除子列表 https stackoverflow com questions 47209786 removing sublists from a list of lists 但当我为我的数据集扩展它时 它不适用于我
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru
  • tkinter:打开一个带有按钮提示的新窗口[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 用户如何按下 tkinter GUI 中的按钮来打开新窗口 我只需要非常简单的解决方案 如果代码也能被解释那就太好了 这

随机推荐

  • 无法从 Git 中递归删除文件

    我想从 Git 中删除 bin 中的所有文件 I run git rm r cached vim Thanks to Pate in finding cached I get fatal pathspec vim colors did no
  • Java int 零前缀? [复制]

    这个问题在这里已经有答案了 可能的重复 带前导零的整数 https stackoverflow com questions 565634 integer with leading zeroes Hi Java 如何处理以零为前缀的字节 整数
  • 如何将 Kotlin PSI 源文件添加到 IDEA Plugin 项目配置中

    我正在尝试为 IDEA 插件之一添加对 kotlin 的支持 到目前为止 我发现了这个page https intellij support jetbrains com hc en us community posts 1150007248
  • 如何使用 Swift 检索通讯录联系人?

    我不明白为什么我的代码不能用 Swift 编译 我正在尝试转换这个 Objective C 代码 CFErrorRef error NULL ABAddressBookRef addressBook ABAddressBookCreateW
  • WPF 将窗口标题绑定到 ViewModel 属性

    我正在尝试将窗口标题绑定到具有 Title 属性的 ViewModel 下面是主窗口 XAML
  • 如何设置Android按钮背景颜色?

    我想为几个按钮使用自定义背景颜色 我试过android background cc2 但它取代了整个按钮 因此它看起来不再像一个按钮 显然可以使用
  • HTTP是无状态的,那么keep-alive是什么意思呢?

    Keep Alive 300 Proxy Connection keep alive 我们知道HTTP连接在请求得到响应时关闭 那么这是什么意思keep alive 有人可以详细说明一下吗 这意味着可以保持连接打开以请求更多资源 例如图像和
  • DDD:从哪里获取值对象列表最合适

    我有一个分配给产品的名为 产品类型 的值类型 一种产品有一种产品类型 为了允许用户从列表中选择类型 我将填充一个下拉列表 在哪里检索产品类型列表最合适 实现存储库模式的类 编辑 通过将产品代码更改为产品类型来澄清 产品类型类似于 DVD C
  • PostgreSQL 9.2:citext[] 上的 GIN 索引

    我需要加快这个查询的速度 SELECT FROM mytable WHERE value ANY citext array col LIMIT 1 where citext array col是一个 citext 数组 我尝试创建一个运算符
  • 为什么我的 Django 视图在每个页面视图中都会被点击两次?

    我似乎一辈子都找不到问题所在 非常简单 我有一个从数据库中提取的数据库对象 将其 视图 增加一 然后保存 我的视图显示增加的值 但随后我的日志显示该值再次增加 g Game objects filter slug slug distinct
  • 将dataUrl转换为blob并通过ajax提交

    我正在使用 imgly 图像裁剪器插件 针对我的应用程序稍作修改 它当前将图像转换为dataUrl并将图像输出为 base64 图像 我可以将其另存为 jpeg 我正在努力调整dataURItoBlob找到函数here https stac
  • 无法打开文档“Main.Storyboard”。无法识别的文件内容

    从 Xcode 7 更新到 Xcode 8 后 我无法打开 Storyboard 有人可以帮忙吗 里面没有显示任何错误 对于我来说 将故事板打开为 源代码 修复合并冲突 然后重新启动 Xcode 就完成了这项工作
  • 使用 PHP 将二进制数据插入 SQL Server

    我在 SQL Server 2005 数据库中有一个 varbinary MAX 字段 我试图弄清楚如何使用 PHP 将二进制数据 即图像 插入到该字段中 我使用 ODBC 连接 SQL Server 数据库 我已经看到许多示例解释了如何与
  • Qt平台插件问题Rstudio

    我正在尝试通过 RStudio 绘制 seaborn 热图 I usereticulateR 中的包 下面是我的代码 library reticulate use condaenv python36 conda auto required
  • 如何用CLOB调用REPLACE(不超过32K)

    Oracle 11g 确实提高了 CLOB 的可用性 重载了大多数字符串函数 因此它们现在可以与 CLOB 一起本地工作 然而 一位同事从他的代码中得到了这个错误 ORA 22828 input pattern or replacement
  • 如何对 django url 进行单元测试?

    除了我的应用程序之外 我的应用程序在所有地方都实现了 100 的测试覆盖率urls py 你对我如何写作有什么建议吗有意义的对我的 URL 进行单元测试 FWIW 这个问题是在我尝试测试驱动开发时出现的 并且希望在编写代码来修复它们之前失败
  • 如何通过已知路由器上的三角测量来确定我的位置?

    有没有可用的开源软件 基本上 我只想根据位置固定且已知的路由器的信号强度进行三角测量 我意识到可能存在干扰的情况 但我们还是坚持列出已知的源代码 谢谢 我不知道任何三边测量软件 有人应该编写一个开源库 看看三边测量 http en wiki
  • 错误 NETSDK1064:找不到软件包 DnsClient,1.2.0

    我有一个 Asp Net core docker 镜像 我上次尝试构建它是两个月前 现在 我在尝试构建它时遇到错误 有任何想法吗 是不是有什么东西破坏了 Microsoft docker 镜像 当尝试在 Elasticbeanstalk 实
  • Python“数组索引太多”

    我正在使用 pandas 读取 python 中的文件 然后将其保存在 numpy 数组中 该文件的尺寸为 11303402 行 x 10 列 我需要拆分数据以进行交叉验证 为此我将数据切片为 11303402 行 x 9 列的示例和 1
  • 在 Cython 类中,使用 __init__ 和 __cinit__ 有什么区别?

    代码块1使用 init cython 3 cdef class c cdef int a str s def init self self a 1 self s abc def get vals self return self a sel