我正在尝试像这样(简化版本)在Python中继承基元类型:
class MyInt(int):
pass
我认为此类的对象将占用与原始对象相同的内存量。但是,显然这是不正确的:
import sys
sys.getsizeof(10) # 24
sys.getsizeof(MyInt(10)) # 72
使用__slots__
,我可以节省一些内存,但是子类仍然需要更多空间:
class MyInt(int):
__slots__ = ()
sys.getsizeof(10) # 24
sys.getsizeof(MyInt(10)) # 56
另一方面,如果我子类化自己的类,则内存使用情况是相同的:
class Father(object):
pass
class Son(Father):
pass
sys.getsizeof(Father()) # 64
sys.getsizeof(Son()) # 64
我正在使用Python 2.7.12。
答案 0 :(得分:0)
仅当在Python 2.2中创建“新样式类”时,才可以在Python中对内置类进行子类化。因此,无需查看代码,也无需仔细阅读此Guido's article上的演示文稿注释,就有可能推断出Python2需要一些样板内部字段来允许内置类(它们的代码库是先前编写的。统一)),并且在子类化时可以像“用户定义的类”一样良好地工作。 (这是“对象”行为,不是“旧式”“ int”对象的代码库内置的)。
无论发生什么事,都位于Python's 2.7 Objects/typeobject.c
内-因此您可以在那儿看看(或等到可以更轻松地分析得出另一个答案的人后再来)
就像@blownhither_ma在上面的评论中提到的那样,Python3中似乎不再是这种情况-我要说类统一自2009年以来已经得到巩固:
In [158]: from sys import getsizeof as sizeof
In [159]: sizeof(int())
Out[159]: 24
In [160]: class MInt(int):
...: __slots__ = ()
...:
In [161]: sizeof(MInt())
Out[161]: 24
因此,尽管您的问题尚待解决,但它们仅对Python 2有意义,而现在还没有人可以在新代码中使用它。