Python解释器如何为不同的方法分配内存?

时间:2016-08-15 07:57:17

标签: python python-2.7 python-internals

有谁能告诉我Python解释器或PVM如何管理以下代码的记忆?

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只使用Heap)?它们何时存储,RunTime或RunTime之前?

例如,我在启动此类后运行此代码:

a = A()
a.getParams()
A.getPurpose()
A.printout()

Python解释器如何在此代码后面分配内存?

1 个答案:

答案 0 :(得分:4)

您示例中的所有内容都只是一个对象。所有对象都在堆上。

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

有关这些对象如何相互关联的详细信息,请参阅datamodel reference documentation

绝大多数Python开发人员不必担心内存管理问题。如果您针对Python C API进行制作,则可能需要阅读Memory Management section,其中包含:{/ p>

  

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