2016-08-15 2 views
1

Kann mir jemand sagen, wie verwaltet Python Interpreter oder PVM Speicher für den folgenden Code?Wie reserviert der Python-Interpreter Speicher für verschiedene Methoden?

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" 

Wenn ich diese Klasse speichern und einige Codes laufen zu dieser Klasse verwandt, wie funktioniert PVM oder Python-Interpreter speichern Klassenvariablen, Klasse/statische Funktionen und Instanzvariablen? Ich war früher ein C++ Programmierer. Ich frage mich, wo diese "Dinge" gespeichert sind (ich weiß, dass Python nur Heap verwendet)? Wann werden sie gespeichert, RunTime oder vor RunTime?

Zum Beispiel führe ich diesen Code nach dieser Klasse Initing:

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

Wie Python-Interpreter Speicher hinter diesem Code zuteilen?

+0

CPython neigt dazu, nur den Heap zu verwenden (möglicherweise ausschließlich), aber dies ist keine Anforderung an die Sprachspezifikation. Du solltest es nicht annehmen (es sollte auch nicht wichtig sein). –

+0

Da Sie aus C++ kommen und C lesen können, sollten Sie sich die Python-Quelle ansehen, um eine Vorstellung davon zu bekommen, wie die Dinge funktionieren. Zum Beispiel [der Bytecode-Interpreter] (https://github.com/python/cpython/blob/master/Python/ceval.c). – poke

+0

@poke Danke. Dies ist ein guter Vorschlag. Ich werde den CPython-Code lesen, um mehr zu verstehen. Da CPython nicht sehr einfach zu verstehen ist, dauert es eine Weile, bis man den Kern erreicht hat. Haben Sie eine Buchempfehlung bezüglich CPython? –

Antwort

4

Alles in Ihrem Beispiel ist einfach ein Objekt. Alle Objekte gehen auf den Haufen.

Das Klassenobjekt wird zur Laufzeit erstellt und verfügt über eine Zuordnung von Attributnamen zu Objekten, wobei alle Namen, die Sie im Klassenrumpf definiert haben, einfach Attribute sind. Die Mehrzahl dieser Objekte implementiert die descriptor protocol (Ausnahme ist das class_purpose Attribut). Die Funktionsobjekte, die die Mehrzahl der Attribute bilden, werden ebenfalls zur Laufzeit angelegt; Der gesamte Compiler erzeugt Code-Objekte, die Bytecode speichern, einige Konstanten (alles Unveränderliche, das vom Code erzeugt wird, einschließlich mehr Code-Objekte für verschachtelte Bereiche).

Weitere Informationen dazu, wie diese Objekte zueinander in Beziehung stehen, finden Sie unter datamodel reference documentation.

Die große Mehrheit der Python-Entwickler muss sich nicht um die Speicherverwaltung kümmern. Wenn Sie gegen die Python C API entwickeln, können Sie auf der Memory Management section zu lesen, die tut Zustand:

Es ist wichtig zu verstehen, dass die Verwaltung des Python Heap durch den Interpreter selbst durchgeführt wird und dass der Benutzer keine Kontrolle darüber, auch wenn sie regelmäßig Objektzeiger auf Speicherblöcke innerhalb dieses Heaps manipuliert. Die Zuweisung von Heap-Speicher für Python-Objekte und andere interne Puffer erfolgt auf Anforderung durch den Python-Speichermanager über die in diesem Dokument aufgeführten Python/C-API-Funktionen.

Verwandte Themen