Dieser Artikel bietet Ihnen eine Einführung in zwei Implementierungsmethoden von Python-Singletons (mit Code). Ich hoffe, dass er Ihnen als Referenz dienen wird.
In den letzten zwei Tagen habe ich mir den Code angesehen, den ich zuvor geschrieben habe, also habe ich nur die Dinge aussortiert, die ich verwendet habe. Der Singleton-Modus wird häufig in der täglichen Codearbeit verwendet,
Hier finden Sie eine Zusammenfassung der Singleton-Methoden, die zuvor auf unterschiedliche Weise implementiert wurden
Die Decorator-Methode
Diese Methode wird auch häufig in der Arbeit verwendet . Es ist auch bequemer zu verwenden. Der Code ist wie folgt implementiert:
def Singleton(cls): _instance = {} def _singleton(*args, **kwargs): if cls not in _instance: _instance[cls] = cls(*args, **kwargs) return _instance[cls] return _singleton
Mir persönlich gefällt diese Methode sehr gut
Klasse erreichtHier gibt es tatsächlich einige Probleme, auf die Sie achten müssen. Schauen Sie sich zunächst die möglichen Fehlercodes an
@Singleton
class A(object):
def __init__(self, x):
self.x = x
Auf den ersten Blick scheint diese Klasse einen Singleton implementiert zu haben, aber hier liegt ein potenzielles Problem vor, das heißt, wenn es sich um eine Multithread-Situation handelt, führt das Schreiben auf diese Weise zu Problemen, insbesondere wenn dies der Fall ist sind einige zeitaufwändige Vorgänge im Initialisierungsobjekt der aktuellen Klasse
Zum Beispiel der folgende Code:
class Member(object): @classmethod def instance(cls, *args, **kwargs): if not hasattr(Member, "_instance"): Member._instance = Member(*args, **kwargs) return Member._instance
Das Ausführungsergebnis von Dieser Code besteht darin, dass mehrere Objekte instanziiert werden, wodurch der von Ihnen geschriebene Singleton keine Wirkung hat
Natürlich denken wir natürlich darüber nach, ihn durch Sperren zu sperren und zu steuern, also ändern wir den obigen Code:
#! /usr/bin/env python3 # .-*- coding:utf-8 .-*- import time import threading import random class Member(object): def __init__(self): time.sleep(random.randint(1,3)) @classmethod def instance(cls, *args, **kwargs): if not hasattr(Member, "_instance"): Member._instance = Member(*args, **kwargs) return Member._instance def task(arg): obj = Member.instance() print(obj) for i in range(5): t = threading.Thread(target=task, args=[i,]) t.start()
Aber es gibt noch ein anderes Problem mit dem obigen Code, nämlich, dass wir nach der Instanziierung jedes Mal, wenn wir die Instanz aufrufen, die Sperre anfordern. Dies ist also der Fall Nicht gut, also ändern wir diesen Teil des Codes erneut:
#! /usr/bin/env python3 # .-*- coding:utf-8 .-*- import time import threading import random class Member(object): _instance_lock = threading.Lock() def __init__(self): i = random.randint(1, 3) print(i) time.sleep(i) @classmethod def instance(cls, *args, **kwargs): with Member._instance_lock: if not hasattr(Member, "_instance"): Member._instance = Member(*args, **kwargs) return Member._instance def task(): obj = Member.instance() print(obj) for i in range(5): threading.Thread(target=task,).start()
Dies ist eine gute Implementierung. Eine einzelne Instanz, die in mehreren Threads verwendet werden kann
Das Obige ist Weitere spannende Inhalte zu Python finden Sie in den Rubriken
Python-Video-Tutorialsund
Python auf der chinesischen PHP-Website. ! !Das obige ist der detaillierte Inhalt vonEinführung in zwei Implementierungsmethoden von Python Singleton (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!