2017-03-29 5 views
1

Eine etwas einfache Frage, aber ich hätte gerne Hilfe, um genau zu verstehen, wie Klassen in Python funktionieren. Wann werden Klassenvariablen festgelegt und werden sie jedes Mal überschrieben, wenn eine Instanz dieser Klasse erstellt wird?Korrekte Art, gemeinsam genutzte Klassenvariablen zu speichern?

Hier ist die allgemeine Situation. Ich habe eine Tabelle mit Daten, auf die alle Instanzen einer bestimmten Klasse zugreifen sollen. Das Problem besteht darin, dass diese Tabelle auf einem Datenbankserver liegt. Ich möchte automatisch eine Verbindung zur Datenbank herstellen und diese Tabelle beim ersten Erstellen einer Instanz dieser Klasse in den Speicher abrufen, aber nicht später.

Es scheint wie eine Klassenvariable würde funktionieren, aber ich wollte nur überprüfen, dass dies der Fall sein würde. Mein Programm wird Hunderte von Instanzen dieser Klasse erstellen, so dass ich definitiv nicht Hunderte von Datenbankaufrufen für dieselbe Tabelle machen oder Hunderte von Kopien derselben Tabelle im Speicher speichern möchte.

Würde ich in der Lage sein, etwas wie das Folgende zu schreiben? Angenommen, "get_table_from_db" ist eine Funktion, die eine Verbindung zu einer Datenbank herstellt und einen Pandas-Datenrahmen mit der entsprechenden Tabelle zurückgibt.

class ExampleClass: 
    table1 = get_table_from_db(arguments) 
    def __init__(self, x, y): 
     self.value = self.table1.iloc[x, y] 

obj1 = ExampleClass(0, 0) 
obj2 = ExampleClass(0, 1) 

Grundsätzlich, wenn ich dieses Skript ausführen, ich will „get_table_from_db“ einmal ausgeführt, entweder vor oder wenn obj1 erstellt wird, und speichern Sie die entsprechenden Datenrahmen zu tabelle1. Wenn obj2 erstellt wird, möchte ich "get_table_from_db" nicht erneut aufrufen, da table1 bereits existiert. Trotzdem möchte ich, dass es für einige seiner Methoden Zugriff auf table1 hat, weil es diese Daten benötigen wird (als Beispiel habe ich self.value einer bestimmten Zelle in der Tabelle zugewiesen, aber mein tatsächlicher Code wird gehen komplizierter sein als das).

Auch eine ähnliche Frage. Wenn die obige Methode funktioniert, kann ich dann eine Klassenvariable innerhalb der Klasse zurücksetzen? Zum Beispiel, wird mir etwas wie die folgende erlauben, die Klassenvariable für alle Instanzen der Klasse zu modifizieren (und durch meine Redout zu ändern)?

class ExampleClass: 
    table1 = get_table_from_db(arguments) 
    def __init__(self, x, y): 
     self.value = self.table1.iloc[x, y] 
    def reset_table(self): 
     ExampleClass.table1 = get_table_from_db(arguments) 

Antwort

3

Die Klassenvariable wird einmal initialisiert werden, wenn die Klasse deklariert wird (so vor entweder obj1 oder obj2 erstellt werden), so wird Ihr Code die Art und Weise arbeiten Sie denken.

Mit Bezug auf Ihre zweite Frage, sollten Sie es wie folgt tun:

class ExampleClass: 
    @classmethod 
    def reset_table(cls): 
     cls.table1 = get_table_from_db(arguments) 

diese Weise können Sie entweder obj.reset_table() oder ExampleClass.reset_table(), ohne dass eine Instanz von ExampleClass aufrufen können.

Verwandte Themen