Seite 1 von 1

Statische Variablen initialisieren

Verfasst: Montag 1. Juni 2009, 17:53
von shor
Hi!

Ich habe eine Klasse, die den Zugriff auf eine Datenbank kapselt. Da die Daten der Datenbank nur einmal vorhanden sein sollen, habe ich den Zugriff darauf mithilfe von statischen Methoden geregelt. Wie schaffe ich es dass sich die Klasse "automatisch" initialisiert bevor ich eine Methode aufrufe die Daten abfrägt? (Bisher muss ich erst einmal die load()-Methode aufrufen).

Vereinfachter Beispielcode:

Code: Alles auswählen

class Data(object):
   dbtable = []
   
   @staticmethod
   def load():
      dbtable = ... (Besorge alle Tupel aus Datenbank) ...
  
   @staticmethod
   def getValue():
      return dbtable
Dankeschön
shor

Verfasst: Montag 1. Juni 2009, 18:27
von hendrikS
Dir fehlt wohl der Konstruktor? Am besten mal nach __init__ nachlesen.

Verfasst: Montag 1. Juni 2009, 18:27
von Darii
Warum nimmst du nicht einfach eine normale Klasse und initialisierst die einfach nur einmal vor der ersten Benutzung? Abgesehen davon funktioniert der Code so wie du ihn da stehen hast, nicht wie gedacht.

Code: Alles auswählen

In [17]: class Foo:
   ....:     bar = {}
   ....:     @staticmethod
   ....:     def baz(): bar = {'key': 'value'}
   ....: 

In [18]: Foo.baz()

In [19]: print Foo.bar
{}
PS: Vergiss am besten dass es staticmethod gibt, stattdessen verwende lieber Funktionen(es gibt nämlich sehr wenige sinnvolle Anwendungsmöglichkeiten für staticmethod, bei den meisten langt eine normale Funktion oder man nimmt classmethod).

@hendrikS: Konstruktor ist sinnlos bei statischen Methoden.

Verfasst: Montag 1. Juni 2009, 18:27
von DatenMetzgerX
Ich würde ehner eine solche Lösung anstreben

Code: Alles auswählen

class Data(object):
  instance_values = dict(dbtables=None)

  def __init__(self):
    self.__dict__ = Data.instance_values
    if not self.dbtables:
      self.dbtables = load_data(.....)

  def get_values():
    return self.dbtables

data = Data()
data.get_values()

Verfasst: Montag 1. Juni 2009, 18:45
von shor
Hallo zusammen,

vielen Dank für Eure Anregungen.
Den Konstruktor kenne ich :-) Der hilft nur, wie schon gesagt, bei statischen Variablen nicht ;-)

Der Punkt ist, ich möchte genau darauf verzichten, die Klasse erst einmal anlegen zu müssen, da ich auf diese oft in anderen Klassen zugreife und ich mich nicht darum kümmern möchte, dass die Daten bereits geladen wurden.

Vielleicht geht noch __call__ überschreiben und vorher testen ob die Variable == None ist und falls ja, dann initialisieren?
Ist halt performancetechnisch übel...

Verfasst: Montag 1. Juni 2009, 18:55
von hendrikS
Ohne das ich jetzt eine Antwort auf Dein Problem habe, denke ich Du hast ein konzeptionelles Problem. Wenn Du keine Objekte vom Typ Deiner Klasse anlegen willst, wozu dann die Klasse?

Verfasst: Montag 1. Juni 2009, 19:11
von Darii
shor hat geschrieben:Der Punkt ist, ich möchte genau darauf verzichten, die Klasse erst einmal anlegen zu müssen, da ich auf diese oft in anderen Klassen zugreife und ich mich nicht darum kümmern möchte, dass die Daten bereits geladen wurden.
Ist doch kein Aufwand

Code: Alles auswählen

# data.py
class Data(object): pass # blabla
# database.py
from data import Data
database = Data() # initialisieren
# x-beliebige Datei
from database import database
# database ist bereits initialisiert
database.get_value()
Ist halt performancetechnisch übel...
Wenn du dir über sowas Gedanken machst, solltest du kein Python verwenden.

Verfasst: Montag 1. Juni 2009, 20:19
von shor
@hendrikS
Ich denke nicht, dass das ein konzeptionelles Problem ist. Schau Dir z. B. mal das Singleton-Pattern an. Zugegebenerweise gibt es dort zwar (genau) ein Objekt einer Klasse am im Prinzip triffts das, was ich gerne hätte.

Ich hätte ja prinzipiell nichts dagegen ein Objekt anzulegen - nur wollte ich die Klasse (bzw. das Objekt) einfach benutzen können, ohne dass ich mir Gedanken machen muss, ob das Objekt schon instantiiert ist.

Im Moment denke ich, dass ich das Ganze wohl per Singleton lösen werde.
Außer jemanden fällt noch was besseres ein :-)

@Darii
Geht das auch, wenn ich das in der Datei data.py ans Ende setze?

Verfasst: Montag 1. Juni 2009, 20:22
von shor
@Darii

Vielen Dank!! :-) Das war genau das, was ich gesucht habe. Habe die Möglichkeit, ans Ende der Datei, nach der Klassendefinition noch was anzuhängen, gar nicht in Betracht gezogen.

Ich denke wohl noch zu sehr in C,C++ oder Java :-)

Verfasst: Montag 1. Juni 2009, 21:50
von str1442
Such mal im Forum nach Singleton (in kurz: Man sollte es nicht verwenden und es gibt eigentlich immer eine bessere Lösung).