2016-08-15 71 views
1

誰能告訴我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解釋的書籍建議嗎? –

回答

4

一切都在你的例子是一個簡單的對象。所有對象都堆在堆上。

類對象在運行時創建,並且具有從屬性名稱的對象,你在類體內定義的所有名稱只是屬性的映射。大多數這些對象實現descriptor protocol(例外是class_purpose屬性)。構成大部分屬性的函數對象也是在運行時創建的;所有編譯器產生的是存儲字節碼的代碼對象,一些常量(由代碼創建的任何不可變的內容,包括嵌套作用域的更多代碼對象)。

關於這些對象如何彼此相關的詳細信息請參見datamodel reference documentation

絕大多數Python開發人員不必擔心內存管理。如果您開發針對Python C API,你可能想在Memory Management section,這確實讀了狀態:

明白了Python堆的管理是由解釋器本身和用戶具有執行是非常重要的無法控制它,即使她經常操縱對象指針到堆中的內存塊。 Python內存管理器通過本文檔中列出的Python/C API函數根據需要爲Python對象和其他內部緩衝區分配堆空間。