Als Material zum Erlernen von GoF-Entwurfsmustern scheint das Buch "Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden" hilfreich zu sein. Da die aufgeführten Beispiele jedoch auf JAVA basieren, habe ich dieselbe Vorgehensweise mit Python versucht, um mein Verständnis zu vertiefen.
Das Singleton-Muster ist eines der Entwurfsmuster in einem objektorientierten Computerprogramm. Definiert von der GoF (Gang of Four). Das Singleton-Muster ist ein Entwurfsmuster, das garantiert, dass nur eine Instanz der Klasse erstellt wird. Wird verwendet, um Mechanismen zu implementieren, die in der gesamten Anwendung absolut einheitlich sein müssen, z. B. Gebietsschema und Erscheinungsbild (Das Obige wird aus Wikipedia zitiert)
Definieren wir eine Klasse, die nur eine Instanz erstellen kann.
Main.py
class Singleton(object):
def __new__(cls, *args, **kargs):
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
class Myclass(Singleton):
def __init__(self, input):
self.input = input
if __name__ == '__main__':
one = Myclass(1)
print("one.input={0}".format(one.input))
two = Myclass(2)
print("one.input={0}, two.input={1}".format(one.input, two.input))
one.input = 0
print("one.input={0}, two.input={1}".format(one.input, two.input))
Versuche dich zu bewegen
$ python Main.py
one.input=1
one.input=2, two.input=2
one.input=0, two.input=0
Ich sehe, es verhält sich wie eine globale Variable.
__new__
[(im Folgenden aus" Python-Sprachreferenz "zitiert)]](https://docs.python.org/ja/3/reference/datamodel.html?highlight=new#object.new)cls
zu erstellen. ** ** **cls
, die zum Erstellen einer Instanz angefordert wird. ** ** **der Superklasse mit den entsprechenden Argumenten für
super (). __ new__ (cls [, ...]) `. Ruft auf, nimmt die erforderlichen Änderungen an der neu erstellten Instanz vor und kehrt dann zurück.__new__ ()
keine Instanz von cls
zurückgibt, wird die Methode __init __ () `der Instanz nicht aufgerufen. ** ** **Wird aufgerufen, bevor das Instanzobjekt erstellt wird, wird dem ersten Argument "cls" ein Klassenobjekt zugewiesen, und der Zweck besteht darin, das Objekt "self" zu instanziieren. Schienbein.
__init __
(im Folgenden aus" Python-Sprachreferenz "zitiert)__new__ ()
) und bevor sie an den Aufrufer zurückgegeben wird.super () .__ init__ ([args ...]
).
--__new__ ()
und__init __ ()
arbeiten zusammen, um ein Objekt zu bilden (__new__ ()
erstellt und __init __ ()
passt es an), es ist also nicht von__ init__ ()
Geben Sie keinen "None" -Wert zurück. Andernfalls wird zur Laufzeit ein TypeError ausgelöst.Wird aufgerufen, nachdem das Instanzobjekt erstellt wurde. Das Instanzobjekt wird dem ersten Argument "self" zugewiesen. Der Zweck besteht darin, das Objekt "self" zu initialisieren. ..
Versuchen Sie, einen Singleton zu schreiben, ohne die Methode "new" zu verwenden.
Main.py
class Singleton(object):
@classmethod
def get_instance(cls, input):
if not hasattr(cls, "_instance"):
cls._instance = cls(input)
else:
cls._instance.input = input
return cls._instance
class Myclass(Singleton):
def __init__(self, input):
self.input = input
if __name__ == '__main__':
one = Myclass.get_instance(1)
print("one.input={0}".format(one.input))
two = Myclass.get_instance(2)
print("one.input={0}, two.input={1}".format(one.input, two.input))
one.input = 0
print("one.input={0}, two.input={1}".format(one.input, two.input))
Versuche dich zu bewegen
$ python Main.py
one.input=1
one.input=2, two.input=2
one.input=0, two.input=0
Dieser Stil ist einfacher zu verwenden. Ich sehe es oft in OpenStack oder beim Lesen von Code.
Recommended Posts