关于对象大小的问题

来源:7-2 如何为创建大量实例节省内存

绝世风华3625689

2017-10-31

import sys


class Person01():
   def __init__(self, HP, MP, Attack, Defense):
      self.HP = HP
      self.MP = MP
      self.Attack = Attack
      self.Defense = Defense


class Person02():
   __slots__ = ['HP', 'MP', 'Attack', 'Defense']

   def __init__(self, HP, MP, Attack, Defense):
      self.HP = HP
      self.MP = MP
      self.Attack = Attack
      self.Defense = Defense


person01 = Person01(300, 40, 120, 450)
person02 = Person02(300, 40, 120, 450)

print(set(dir(person01)) - set(dir(person02)))

person01.__dict__["test"] = "test"
print(sys.getsizeof(person01.__dict__))

print(sys.getsizeof(person01), "Person01")
print(sys.getsizeof(person02), "Person02")

输出结果为:

{'__dict__', '__weakref__'}
864
56 Person01
72 Person02

老师,麻烦资讯两个问题,第一个问题:

上述代码中,通过getsizeof()返回的结果应该是字节,但输出字典的大小为800+字节,而两个对象本身才不到100字节。我的理解是,__dict__字典是属于对象的一部分,所以对象的大小应该比字典要大,至少要包括了字典。所以代码得出的结果和我理解的有些冲突。我希望知道,为什么会出现这种情况呢?

第二个问题是:

person01对象是包含字典的,而person02是不包含字典的,而最终输出的对象大小,反而是person02比较大。这是为什么呢?

写回答

1回答

程序员硕

2017-10-31

你好奇这种问题, 我猜想你学过C, 你可以理解为计算Person对象时, __dict__是个指针. __slots__相当于加了几个固定的指针。

0
1
绝世风华3625689
非常感谢老师!说到指针的话我就可以理解了。
2017-10-31
共1条回复

Python高效编程技巧实战

精选50个Python案例,源自实战,全面提升Python编程能力

2582 学习 · 360 问题

查看课程