<p>这些文档位于<a href="http://docs.python.org/3.0/c-api/typeobj.html" rel="noreferrer">http://docs.python.org/3.0/c-api/typeobj.html</a>和
<a href="http://docs.python.org/3.0/extending/newtypes.html" rel="noreferrer">http://docs.python.org/3.0/extending/newtypes.html</a>描述如何创建自己的类型。</p>
<p>tp_alloc为实例执行低级内存分配。这相当于malloc(),并将refcnt初始化为1。Python有自己的分配器PyType_GenericAlloc,但是类型可以实现专用的分配器。</p>
<p>tp_new与Python's_uunew相同。与指向数据的指针相比,它通常用于不可变对象,其中数据存储在实例本身中。例如,字符串和元组将其数据存储在实例中,而不是使用char*或PyTuple*。</p>
<p>对于这种情况,tp_new根据输入参数计算出需要多少内存,并调用tp_alloc获取内存,然后初始化基本字段。tp_new不需要调用tp_alloc。例如,它可以返回缓存的对象。</p>
<p>tp_init与Python的初始化相同。大多数初始化都应该在这个函数中。</p>
<p>new和init之间的区别叫做<a href="http://groups.google.com/group/comp.lang.python/msg/e78840758484b94d" rel="noreferrer">two-stage initialization</a>,或者<a href="http://groups.google.com/group/comp.lang.python/browse_thread/thread/b129dc656f4d0c8b/e43ae56909c3c00a?lnk=gst&q=two-phase+init#e43ae56909c3c00a" rel="noreferrer">two-phase initialization</a>。</p>
<p>你说“<em>c++刚刚有了新的</em>”,但这不正确。TPL OLLC对应于C++中的自定义竞技场分配器;最后一个链接更多地讨论C++和Python风格之间的相似之处。</p>
<p>还可以阅读<a href="http://www.python.org/download/releases/2.2/descrintro/" rel="noreferrer">http://www.python.org/download/releases/2.2/descrintro/</a>了解有关new和init如何交互的详细信息。</p>
<p>你写的是你想“在c++中直接创建对象”。这是相当困难的,因为至少你必须将在对象实例化期间发生的任何Python异常转换成C++异常。您可以尝试查看Boost::Python以获得有关此任务的帮助。或者可以使用两阶段初始化。;)</p>