为什么附加的类函数不影响其实例之一的内存使用?

Noa*_*oah 4 python optimization

我的假设是,即使一个函数什么也不做,它仍然应该占用内存,但是在下面,foo如果Foo有一个额外的函数,为什么不占用更多的内存呢?

class Foo():
  def __init__(self):
    pass

  def why_does_this_not_use_memory(self):
    pass

class Bar():
  def __init__(self):
    pass

import sys

foo = Foo()
print(sys.getsizeof(foo))  # 56
bar = Bar()
print(sys.getsizeof(bar))  # 56
Run Code Online (Sandbox Code Playgroud)

che*_*ner 6

首先,方法是根据对象的类型而不是对象本身存储的。

但是,您会发现,如果您要求班级人数,它们也相等。

>>> sys.getsizeof(Foo)
1064
>>> sys.getsizeof(Bar)
1064
Run Code Online (Sandbox Code Playgroud)

每个类对象都有一个__dict__属性,该属性存储对其方法和其他属性的引用。

>>> Foo.__dict__['why_does_this_not_use_take_memory']
<function Foo.why_does_this_not_use_take_memory at 0x103609ef0>
Run Code Online (Sandbox Code Playgroud)

但是,sys.getsizeof不会递归于此dict;它仅返回class对象本身使用的内存,不包括您可以通过及其属性访问的对象class


每个方法都是一个类属性。通常,无需过多地描述描述符协议,foo.why_does_this_not_use_take_memory实际上就像是

Foo.why_does_this_not_use_take_memory.__get__(foo, Foo)
Run Code Online (Sandbox Code Playgroud)

也就是说,function检索了-valued属性,但随后__get__调用了其方法以返回method特定于的对象foo。从method本质上讲,它只是函数的包装,该函数在被调用时将传递foo其自身的参数Foo.why_does_this_not_use_take_memoryself绑定到foo)。