Maison  >  Article  >  développement back-end  >  Exemple de modèle singleton Python

Exemple de modèle singleton Python

高洛峰
高洛峰original
2017-03-03 11:57:471129parcourir

Les exemples de cet article décrivent le modèle singleton Python. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Mode Singleton : Assurez-vous qu'une classe n'a qu'une seule instance et fournissez une instance globale accéder à ce point d'accès.

Façons d'implémenter une classe avec une seule instance :

1. Laissez une variable globale permettre l'accès à un objet, mais elle ne peut pas empêcher l'instanciation de plusieurs objets. extérieurement.

2. Laissez la classe elle-même enregistrer sa seule instance. Cette classe peut garantir qu'aucune autre instance ne peut être créée.

Mode Singleton en multi-threading : Verrouillage-double verrouillage

Classe singleton style affamé : Lorsque la classe est chargée Instanciez-vous (statique initialisation). L’avantage est qu’il évite les problèmes de sécurité d’un accès multi-thread, mais l’inconvénient est qu’il occupe par avance les ressources système.

Classe singleton paresseuse : s'instancie uniquement lorsqu'elle est référencée pour la première fois. Évitez d'occuper les ressources système au début, mais l'accès multithread pose des problèmes de sécurité.

Exemple :

#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();

Résultat :

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

Explication supplémentaire @staticmethod Lorsque l'on mentionne classmethod en Python, staticmethod doit être mentionné, non pas parce qu'il existe une relation entre les deux, mais pour permettre aux utilisateurs de faire la distinction afin de pouvoir écrire du code plus clairement. En C, nous comprenons que la fonction accessible directement via le nom de classe est appelée la fonction statique de la classe, c'est-à-dire la fonction modifiée par static. On peut voir que classmethod et staticmethod en C sont le même concept. Alors, quelle est la différence entre les deux en python ? Voyons d'abord comment déclarer les deux dans le code python. Il n'est pas nécessaire de transmettre le nom de la classe. En fait, c'est la plus grande différence entre les deux.

Les deux peuvent être appelés via des noms de classe ou des objets d'instance de classe. Comme l'accent est mis sur la méthode de classe et la méthode statique, il est préférable d'utiliser des noms de classe lors de l'écriture de code.

class MyClass:
 ...
 @classmethod # classmethod的修饰符
 def class_method(cls, arg1, arg2, ...):
  ...
 @staticmethod # staticmethod的修饰符
 def static_method(arg1, arg2, ...):
  ...
La méthode statique est configurée pour être définie dans la classe. De manière générale, elle est rarement utilisée de cette manière. Vous pouvez utiliser des fonctions au niveau du module pour la remplacer. Puisqu’il est défini dans une classe, l’auteur doit l’avoir considéré.

Pour la méthode de classe, elle peut être redéfinie via des sous-classes.

Mentionnez les fonctions au niveau de la classe, et mentionnez également les variables au niveau de la classe en passant

Afin de distinguer clairement ce qui précède deux i , la meilleure façon est de considérer que tout en python est objet, donc i=123 appartient à l'objet de classe et i=456 appartient à l'objet d'instance de classe

Pour plus d'articles liés aux exemples de mode Python singleton, veuillez faire attention au site Web chinois PHP !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn