Einführung in zwei Implementierungsmethoden von Python Singleton (mit Code)

不言
Freigeben: 2018-10-12 15:37:00
nach vorne
2034 Leute haben es durchsucht

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
Nach dem Login kopieren

Mir persönlich gefällt diese Methode sehr gut

Klasse erreicht

Hier 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
Nach dem Login kopieren

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
Nach dem Login kopieren

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()
Nach dem Login kopieren

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()
Nach dem Login kopieren

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-Tutorials

und

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!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage