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?
Einmalige Methodenaufrufe
@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.
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:
Wie sieht denn dein genauer Anwendungsfall aus? Möglicherweise kann man dann konkretere Aussagen treffen.
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
Das Leben ist wie ein Tennisball.
Python hat Singletons schon eingebaut. Ein Modul kannst du problemlos als Singleton verwenden.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.
- 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
assert encoding_kapiert