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解释器分配的代码背后的记忆?

+0

CPython中往往只使用堆(也许完全),但是这不是一种语言规范要求。你不应该认为它(也不重要)。 –

+0

既然你来自C++并且可以读取C,你可能需要查看Python源代码以了解事情的工作原理。例如[字节码解释器](https://github.com/python/cpython/blob/master/Python/ceval.c)。 – poke

+0

@poke谢谢。这是一个很好的建议。我将阅读CPython代码以了解更多信息。由于对CPython的理解不是很容易,因此需要一段时间才能获得核心。你有关于CPython解释的书籍建议吗? –

一切都在你的例子是一个简单的对象。所有对象都堆在堆上。

类对象在运行时创建,并且具有从属性名称的对象,你在类体内定义的所有名称只是属性的映射。大多数这些对象实现descriptor protocol(例外是class_purpose属性)。构成大部分属性的函数对象也是在运行时创建的;所有编译器产生的是存储字节码的代码对象,一些常量(由代码创建的任何不可变的内容,包括嵌套作用域的更多代码对象)。

关于这些对象如何彼此相关的详细信息请参见datamodel reference documentation

绝大多数Python开发人员不必担心内存管理。如果您开发针对Python C API,你可能想在Memory Management section,这确实读了状态:

明白了Python堆的管理是由解释器本身和用户具有执行是非常重要的无法控制它,即使她经常操纵对象指针到堆中的内存块。 Python内存管理器通过本文档中列出的Python/C API函数根据需要为Python对象和其他内部缓冲区分配堆空间。