Heim >Backend-Entwicklung >Python-Tutorial >Beispiel für ein Python-Singleton-Muster

Beispiel für ein Python-Singleton-Muster

高洛峰
高洛峰Original
2017-03-03 11:57:471156Durchsuche

Die Beispiele in diesem Artikel beschreiben das Python-Singleton-Muster. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Singleton-Modus: Stellen Sie sicher, dass eine Klasse nur eine Instanz hat und stellen Sie eine globale Instanz bereit Zugriff auf den Zugangspunkt.

Möglichkeiten zum Implementieren einer Klasse mit nur einer Instanz:

1. Eine globale Variable ermöglicht den Zugriff auf ein Objekt, kann jedoch nicht verhindern, dass mehrere Objekte instanziiert werden äußerlich.

2. Lassen Sie die Klasse selbst ihre einzige Instanz speichern. Diese Klasse kann sicherstellen, dass keine weiteren Instanzen erstellt werden.

Singleton-Modus im Multithreading: Lock-Double-Lock

Singleton-Klasse im hungrigen Stil: Wenn die Klasse geladen wird, instanziieren Sie sich selbst (statisch). Initialisierung). Der Vorteil besteht darin, dass die Sicherheitsprobleme des Multithread-Zugriffs vermieden werden. Der Nachteil besteht jedoch darin, dass Systemressourcen im Voraus belegt werden.

Lazy Singleton-Klasse: instanziiert sich selbst nur, wenn zum ersten Mal darauf verwiesen wird. Vermeiden Sie zu Beginn die Belegung von Systemressourcen, es gibt jedoch Sicherheitsprobleme beim Multithread-Zugriff.

Beispiel:

#encoding=utf-8
#单例模式
def PrintInfo(info):
#  print unicode(info,'utf-8').decode('gbk')
  print info.decode('utf-8').encode('utf-8')
import threading
#单例类
class Singleton():
  instance=None
  mutex=threading.Lock()
  def _init__(self):
    pass
  @staticmethod
  def GetInstance():
    if(Singleton.instance==None):
      Singleton.mutex.acquire()
      if(Singleton.instance==None):
        PrintInfo('初始化实例')
        Singleton.instance=Singleton()
      else:
        PrintInfo('单例已经实例化')
      Singleton.mutex.release()
    else:
      PrintInfo('单例已经实例化')
    return Singleton.instance
def clientUI():
  Singleton.GetInstance()
  Singleton.GetInstance()
  Singleton.GetInstance()
  return
if __name__=='__main__':
  clientUI();

Ergebnis:

初始化实例 单例已经实例化 单例已经实例化

Zusätzliche Erklärung @staticmethod Bei der Erwähnung von Klassenmethode in Python muss staticmethod erwähnt werden, nicht weil zwischen den beiden eine Beziehung besteht, sondern um Benutzern die Unterscheidung zu ermöglichen, damit sie Code klarer schreiben können. In C++ verstehen wir, dass Funktionen, auf die direkt über den Klassennamen zugegriffen wird, als statische Funktionen der Klasse bezeichnet werden, dh als statisch modifizierte Funktionen. Es ist ersichtlich, dass Klassenmethode und statische Methode in C++ dasselbe Konzept sind. Was ist also der Unterschied zwischen den beiden in Python? Schauen wir uns zunächst an, wie die beiden im Python-Code deklariert werden. Es ist nicht erforderlich, den Klassennamen zu übergeben. Dies ist tatsächlich der größte Unterschied zwischen den beiden.

Beide können über Klassennamen oder Klasseninstanzobjekte aufgerufen werden. Da der Schwerpunkt auf der Klassenmethode und der statischen Methode liegt, ist es am besten, beim Schreiben von Code Klassennamen zu verwenden.

class MyClass:
 ...
 @classmethod # classmethod的修饰符
 def class_method(cls, arg1, arg2, ...):
  ...
 @staticmethod # staticmethod的修饰符
 def static_method(arg1, arg2, ...):
  ...
Die statische Methode ist so eingerichtet, dass sie in der Klasse definiert wird, sie wird jedoch selten auf diese Weise verwendet. Sie können sie durch Funktionen auf Modulebene ersetzen. Da es in einer Klasse definiert werden soll, muss der Autor darüber nachgedacht haben.

Für die Klassenmethode kann sie durch Unterklassen neu definiert werden.

Erwähnen Sie Funktionen auf Klassenebene und erwähnen Sie übrigens auch Variablen auf Klassenebene

Um das oben Genannte klar zu unterscheiden Zweitens ist es am besten, davon auszugehen, dass alles in Python ein Objekt ist, also gehört i=123 zum Klassenobjekt und i=456 zum Klasseninstanzobjekt.

Weitere Artikel zu Python-Singleton-Modus-Beispielen finden Sie unter Bitte achten Sie auf die chinesische PHP-Website!

Stellungnahme:
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