Ich dachte über die Verwendung von Singleton-Muster in meinem Projekt, also suchte ich in StackOverflow nach einem phytonischen Weg, um es zu implementieren. Ich fand this question mit der angenommenen Antwort, die besagt, dass "ein Modul mit Funktionen (und nicht eine Klasse) würde gut als ein Singleton dienen". Auf der anderen Seite hatte die zweite Antwort einen Vorschlag, the Borg pattern zu verwenden. Für mich ist die Verwendung eines Moduls eine einfache und unkomplizierte Lösung, daher würde ich gerne verstehen, wenn Borg zu bevorzugen ist.Borg Muster oder nur Modul mit Funktionen
Antwort
ein Singleton und ein Modul nur eine Instanz, für alle Anwendungs Lebensdauer. Diese Instanz wird instanziiert gehalten, auch wenn sie nicht benötigt wird.
Das Borg-Muster ist über den gemeinsamen Status. Jede Client-Klasse erstellt eine neue Instanz des Borg, aber diese Instanz wird entsorgt, wenn sie nicht mehr benötigt wird - es ist ein viel eleganterer Ansatz.
Darüber hinaus ist es viel einfacher, eine Borg zu subklassen oder zu spotten.
+1: "leichter Unterklasse oder Mock eine Borg". Der Rest ist nicht hilfreich. Die Borg kann einfach für die Dauer der Anwendung erstellt werden und ein Modul kann geladen und gelöscht werden, um eine kürzere Lebensdauer zu haben. Der "geteilte Staat" ist eine Subtilität, die nichts erklären hilft. Halten Sie sich an das Unterklassengeschäft, das macht Sinn. –
Der Unterschied ist, dass Sie im Borg-Muster verschiedene Objekte haben, deren Attribute identisch sind, während die Verwendung der Modulversion Ihnen ein Objekt (das Modul) liefert.
Auch ein Objekt und ein Modul unterscheiden sich geringfügig: Sie können keine Module pürieren, aber Sie können Klassen pürieren. Sie können aber auch Operationen auf Objekte (>, <, +, -, etc.)
Um ein bisschen off-topic: mit einigen Änderungen des Borg-Muster kann als eine sehr einfache Multiton verwendet werden:
class Multiton(object):
__shared_states = {}
def __init__(self, name):
if not self.__shared_states.has_key(name):
self.__shared_states[name] = {}
self.__dict__ = self.__shared_states[name]
Können Sie stattdessen eine statische Klasse verwenden? SO Question
class Test(object):
i = 3 # class (or static) variable
@classmethod
def g(cls, arg):
# here we can use 'cls' instead of the class name (Test)
if arg > cls.i:
cls.i = arg # would the the same as Test.i = arg1
http://dirtsimple.org/2004/12/python-is-not-java.html –
Punkt genommen, nur eine Idee – Sam
Ich habe einen Anwendungsfall, wo borg Muster scheint:
Sie nicht Funktion auf Modulebene als @property definieren. Wenn Sie möchten, dass einige allgemeine Daten (wie config) dynamische Eigenschaften zurückgeben, können Sie sie von Borg ableiten lassen und dann Property-Methoden schreiben.
- 1. Python Borg Muster Problem
- 2. Anonym vs Funktionen in JavaScript-Modul-Muster?
- 3. Modul mit zwei Funktionen
- 4. Javascript Modul Muster, verschachtelte Funktionen und Sub-Module
- 5. JavaScript-Modul Muster: Standardwerte
- 6. JS Modul Muster Überbrückungsfunktion
- 7. Vererbung und Modul Muster
- 8. addEventListener Modul Muster
- 9. RequireJS und JS Modul Muster
- 10. Wie nur authentifiziert auf einige Funktionen in Elixir-Modul
- 11. Warum enthält dieses Modul nur einen Teil der registrierten Funktionen?
- 12. Wie lange Modul Muster Namespace
- 13. Modul Muster: Funktion nicht definiert
- 14. JavaScript-Modul Muster/Organisation/Submodule
- 15. Pythonischer Weg: Utility-Funktionen in Klasse oder Modul
- 16. JavaScript Modul Muster gibt unerwartete Ergebnisse
- 17. Profilieren nur benutzerdefinierte Funktionen pstats
- 18. Wie Ruby-Modul-Funktionen mockten?
- 19. Modul mit Klassen mit nur statischen Methoden
- 20. LocalDateTime.parse() mit einem Muster nur Zahlen
- 21. Javascript Modul Muster und das neue Schlüsselwort
- 22. NSPredicate mit Funktionen oder Selektoren
- 23. alles löschen, bevor Muster einschließlich Muster mit awk oder sed
- 24. JavaScript: Modul-basierte Singleton-Muster verstehen
- 25. JavaScript-Modul Muster vs Konstruktor mit Methoden im Konstruktor definiert
- 26. Observer Muster oder Databinding
- 27. Nur Getter oder Setter aus einem Modul exportieren
- 28. Benutzerzugriffsrechte oder Berechtigungen für Funktionen einer Webanwendung Muster oder bewährte Methoden
- 29. Modul Muster Fehler in ES6 (Erweiterung)
- 30. Reagieren Formular: beste Muster oder Bibliothek
Verwenden Sie ein Modul, bis das Gegenteil bewiesen ist. –