2016-07-07 10 views
1

Ich habe eine Python-Klasse, die auf einen großen Datensatz verweisen muss. Ich muss Tausende von Instanzen der Klasse erstellen, damit ich den Datensatz nicht jedes Mal laden möchte. Es wäre einfach, die Daten in einer anderen Klasse zu setzen, die ersten und die andere als Argument übergeben erstellt werden muss:Python - Daten auf der ersten Instanz der Klasse laden

class Dataset(): 
    def __init__(self, filename): 
     # load dataset... 

class Class_using_dataset(): 
    def __init__(self, ds) 
     # use the dataset and do other stuff 

ds = Dataset('file.csv') 
c1 = Class_using_dataset(ds) 
c2 = Class_using_dataset(ds) 
# etc... 

Aber ich will nicht mein Benutzer mit dem Datensatz zu tun zu haben, da es ist immer dasselbe, wenn ich es einfach im Hintergrund machen kann.

Gibt es eine pythonische/kanonische Methode, um die Daten in einen globalen Namespace zu laden, wenn ich die erste Instanz meiner Klasse erstelle? Ich hoffe auf etwas wie:

class Class_using_dataset(): 
    def __init__(self): 
     if dataset doesn't exist: 
      load dataset into global namespace 
     use dataset 
+0

Nicht. Machen Sie 'Class_using_dataset' zu einer Methode des Datasets oder einer Klassenmethode von' Class', die ein Dataset übernimmt. In beiden Fällen können Sie eine Abschluss- oder gebundene Methode verwenden, um die Kosten zu entfernen, während die Dinge lokal bleiben. Globale Variablen sind schlecht. – Veedrac

Antwort

1

können Sie entweder laden die Datenmenge in einer Klassenvariablen zum Zeitpunkt der Class_using_dataset Klasse analysiert wird, oder wenn der Benutzer die erste Instanz der Klasse erstellt.

Die erste Strategie erfordert nur, dass Sie die Zeile verschieben, die das Dataset in die Klasse selbst lädt.

class Dataset(): 
    def __init__(self, filename): 
     # load dataset... 

class Class_using_dataset(): 
    ds = Dataset('file.csv') 

    def __init__(self) 
     # use the dataset and do other stuff 

# `Class_using_dataset.ds` already has the loaded dataset 
c1 = Class_using_dataset() 
c2 = Class_using_dataset() 

Für die zweite, weisen None zu der Klasse variabel und nur die Datenmenge in dem __init__ Verfahren laden, wenn dsNone ist.

class Dataset(): 
    def __init__(self, filename): 
     # load dataset... 

class Class_using_dataset(): 
    ds = None 

    def __init__(self) 
     if Class_using_dataset.ds is None: 
      Class_using_dataset.ds = Dataset('file.csv') 
     # use the dataset and do other stuff 

# `Class_using_dataset.ds` is `None` 
c1 = Class_using_dataset() 
# Now the dataset is loaded 
c2 = Class_using_dataset() 
1

Wenn die Datenmenge zwischen allen Instanzen der Klasse geteilt wird, machen Sie es zu einer Klassenvariablen.

class Dataset(): 
    def __init__(self, filename): 
     # load dataset... 

class Class_using_dataset(): 
    def __init__(self) 
     # use the dataset and do other stuff 

Class_using_dataset.ds = Dataset('file.csv') 
c1 = Class_using_dataset() 
c2 = Class_using_dataset() 
# etc... 
+0

Ist es möglich, eine Variation zu machen, wo der Benutzer sie überhaupt nicht sehen muss? In Ihrer Version sieht es so aus, als würde es die Datei nur in der Zeile laden, in der Sie sie explizit festgelegt haben. Wenn ich es innerhalb der Klasse lade, wird es jedes Mal geladen, wenn eine Instanz erstellt wird oder nur einmal? – ericksonla

+0

Wenn Sie es in die Klasse _before_ the '__init__' einfügen, wird es nur einmal geladen. Probieren Sie es aus (mit einem einfachen 'print()' in der Klasse 'Dataset') und sehen Sie. – TigerhawkT3

Verwandte Themen