<p>您只能通过C API来实现这一点。清除类型对象的<code>tp_flags</code>的<a href="http://docs.python.org/py3k/c-api/typeobj.html#Py_TPFLAGS_BASETYPE" rel="nofollow noreferrer">^{<cd1>}</a>位</p>
<p>例如,<code>bool</code>不能子类化(<a href="https://github.com/python/cpython/blob/63298930fb531ba2bb4f23bc3b915dbf1e17e9e1/Objects/boolobject.c#L178" rel="nofollow noreferrer">cpython-code on github</a>):</p>
<pre><code>PyTypeObject PyBool_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"bool",
...
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
...
};
</code></pre>
<p>但是<code>int</code>可以(<a href="https://github.com/python/cpython/blob/63298930fb531ba2bb4f23bc3b915dbf1e17e9e1/Objects/longobject.c#L5649" rel="nofollow noreferrer">cpython-code on github</a>):</p>
<pre class="lang-c prettyprint-override"><code>PyTypeObject PyLong_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"int", /* tp_name */
...
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
Py_TPFLAGS_LONG_SUBCLASS, /* tp_flags */
...
};
</code></pre>
<p>因为<code>Py_TPFLAGS_BASETYPE</code>-位是在<code>tp_flags</code>中设置的</p>