Python解释器如何为不同的方法分配内存?
问题描述:
谁能告诉我Python解释器或PVM如何管理以下代码的内存?Python解释器如何为不同的方法分配内存?
class A(object):
class_purpose = "template"
def __init__(self):
self.a = 0.0
self.b = 0.0
def getParams(self):
return self.a, self.b
@classmethod
def getPurpose(cls):
return cls.class_purpose
@staticmethod
def printout():
print "This is class A"
当我保存这个类并运行与此相关的类的一些代码,请问PVM或Python解释器储存类变量,类/静态函数和实例变量?我曾经是一名C++程序员。我不知道这些“东西”存储在哪里(我知道Python只使用堆)?它们何时存储,运行时间或运行时间之前?
例如,我INITING这个类后运行该代码:
a = A()
a.getParams()
A.getPurpose()
A.printout()
如何Python解释器分配的代码背后的记忆?
答
一切都在你的例子是一个简单的对象。所有对象都堆在堆上。
类对象在运行时创建,并且具有从属性名称的对象,你在类体内定义的所有名称只是属性的映射。大多数这些对象实现descriptor protocol(例外是class_purpose
属性)。构成大部分属性的函数对象也是在运行时创建的;所有编译器产生的是存储字节码的代码对象,一些常量(由代码创建的任何不可变的内容,包括嵌套作用域的更多代码对象)。
关于这些对象如何彼此相关的详细信息请参见datamodel reference documentation。
绝大多数Python开发人员不必担心内存管理。如果您开发针对Python C API,你可能想在Memory Management section,这确实读了状态:
明白了Python堆的管理是由解释器本身和用户具有执行是非常重要的无法控制它,即使她经常操纵对象指针到堆中的内存块。 Python内存管理器通过本文档中列出的Python/C API函数根据需要为Python对象和其他内部缓冲区分配堆空间。
CPython中往往只使用堆(也许完全),但是这不是一种语言规范要求。你不应该认为它(也不重要)。 –
既然你来自C++并且可以读取C,你可能需要查看Python源代码以了解事情的工作原理。例如[字节码解释器](https://github.com/python/cpython/blob/master/Python/ceval.c)。 – poke
@poke谢谢。这是一个很好的建议。我将阅读CPython代码以了解更多信息。由于对CPython的理解不是很容易,因此需要一段时间才能获得核心。你有关于CPython解释的书籍建议吗? –