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