防止从 Python 调用(创建 C 类型的实例)的正确方法是什么?
我考虑过提供一个引发异常的tp_init
,但据我了解,仍然允许直接在该类型上调用__new__
。
C 函数返回该类型的实例——这是创建该类型实例的唯一方法。
编辑:我的目的是,如果我类型的用户不小心错误地使用它,他们将得到一个异常(exception)。 C 代码是这样的,在从 Python 错误创建的对象上调用函数会崩溃。我意识到这很不寻常:到目前为止,我的所有 C 扩展类型在从 Python 实例化时都运行良好。我的问题是是否有一种常用的方法来提供此限制。
最佳答案
简单:将类型的 tp_new 槽保留为空。
>>> Foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot create 'foo.Foo' instances
>>> Foo.__new__(Foo)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object.__new__(foo.Foo) is not safe, use foo.Foo.__new__()
如果您继承自基本对象类型以外的类型,则必须在调用 PyType_Ready() 后将 tp_new 设置为 NULL。
关于python - 防止从 Python 调用 C 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1079690/