Einmalige Methodenaufrufe

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
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Ich baue manchmal Konstruktormethoden, die nur ein einziges Mal aufgerufen werden sollen, da nur eine einzige Instanz der damit gebauten Klasse sinnvoll ist. Damit ich sie nicht ungewollt indirekt ein zweites Mal aufrufe, gebe ich der erstellten Instanz meist denselben Namen wie der Methode; damit wäre die Methode "weg vom Fenster" und kann nie wieder aufgerufen werden.

Ist so eine Vorgehensweise in Ordnung oder hat sie ungeahnte Seiteneffekte?
BlackJack

@Goswin: Das klingt schräg und verwirrend. Man weiss dann nicht was der Name eigentlich bedeutet, solange man nicht weiss ob der Aufruf schon passiert ist oder nicht.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn du nur eine Instanz haben willst, dann bietet sich vielleicht das Borg-Pattern an. Ansonsten kannst du es für Funktionen natürlich auch explizit machen:

Code: Alles auswählen

class AlreadyCalledError(Exception):
    pass


def once(func):
    func._lock = threading.Lock()
    func._called = False

    def wrapper(*args, **kwds):
        with func._lock:
            if func._called:
                raise AlreadyCalledError

            try:
                return func(*args, **kwds)
            finally:
                func._called = True

    return wrapper
Wie sieht denn dein genauer Anwendungsfall aus? Möglicherweise kann man dann konkretere Aussagen treffen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Goswin hat geschrieben:Ich baue manchmal Konstruktormethoden, die nur ein einziges Mal aufgerufen werden sollen, da nur eine einzige Instanz der damit gebauten Klasse sinnvoll ist.
Python hat Singletons schon eingebaut. Ein Modul kannst du problemlos als Singleton verwenden.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Vielen Dank für eure Antworten! :) Ich probiere dann mal einiges aus.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zu dem Thema vielleicht noch ein Link: http://lucumr.pocoo.org/2009/7/24/singl ... in-python/
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten