Statische Variablen initialisieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
shor
User
Beiträge: 13
Registriert: Montag 7. April 2008, 22:18

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
Zuletzt geändert von shor am Montag 1. Juni 2009, 20:22, insgesamt 1-mal geändert.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Dir fehlt wohl der Konstruktor? Am besten mal nach __init__ nachlesen.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Zuletzt geändert von Darii am Montag 1. Juni 2009, 18:31, insgesamt 1-mal geändert.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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()
shor
User
Beiträge: 13
Registriert: Montag 7. April 2008, 22:18

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...
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
shor
User
Beiträge: 13
Registriert: Montag 7. April 2008, 22:18

@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?
shor
User
Beiträge: 13
Registriert: Montag 7. April 2008, 22:18

@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 :-)
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Such mal im Forum nach Singleton (in kurz: Man sollte es nicht verwenden und es gibt eigentlich immer eine bessere Lösung).
Antworten