2016-08-15 5 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がHeapのみを使用することを知っています)?それらはいつ、ランタイムかランタイムの前に保存されますか?例えば

、私はこのクラスを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メモリマネージャーの要求に応じて実行されます。

関連する問題