为什么非空槽不能与 int、tuple、bytes 子类一起使用?

Bob*_*ver 6 python class slots python-3.x

参考手册中明确记录了这一点:

\n
\n

非空 _ slot _ 不适用于从 \xe2\x80\x9cvariable-length\xe2\x80\x9d 内置类型(例如 int、bytes 和 tuple)派生的类。

\n
\n

情况确实如此,写道:

\n
class MyInt(int):\n    __slots__ = 'spam',\n
Run Code Online (Sandbox Code Playgroud)\n

结果是:

\n
TypeError: nonempty __slots__ not supported for subtype of 'int'\n
Run Code Online (Sandbox Code Playgroud)\n

这是为什么呢?为什么空槽可以使用但非空槽禁止使用?

\n

Dav*_*ing 5

__slots__在 object\xe2\x80\x99s 布局中为定义的每个槽以固定偏移量保留空间。(这就是它避免使用 a__dict__来存储它们的方法。)可变长度对象可以在其可变大小数据之前有一个固定长度的前缀,但是当从这样的类型派生时,\xe2\x80\x99s 没有可用的添加槽的固定偏移量。由于 的部分目的__slots__是快速查找,因此教它如何查看可变长度数据的末尾并没有多大意义。 __dict__然而,确实有这样的支持,因此用 .xe2\x80\x99抑制它是有意义的__slots__=()

\n