Skip to main content
 首页 » 编程设计

python之防止从 Python 调用 C 类型

2024年08月12日33yxwkf

防止从 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。