Python 단일 모드 의 두 가지 실현 방법

2255 단어 Python단일 모드
Python 단일 모드 의 두 가지 실현 방법
방법 1 

import threading 
 
class Singleton(object): 
  __instance = None 
 
  __lock = threading.Lock()  # used to synchronize code 
 
  def __init__(self): 
    "disable the __init__ method" 
 
  @staticmethod 
  def getInstance(): 
    if not Singleton.__instance: 
      Singleton.__lock.acquire() 
      if not Singleton.__instance: 
        Singleton.__instance = object.__new__(Singleton) 
        object.__init__(Singleton.__instance) 
      Singleton.__lock.release() 
    return Singleton.__instance 
 1.비활성화init__방법,대상 을 직접 만 들 수 없습니다.
 2.__instance,단일 대상 민영화.
 3.@staticmethod,정적 방법,클래스 이름 을 통 해 직접 호출 합 니 다.
 4.__lock,코드 자물쇠.
 5.object 클래스 를 계승 하여 object 의 호출new__방법 은 단일 대상 을 만 들 고 object 의 를 호출 합 니 다.init__방법 완전 초기 화. 
6.이중 검사 에 자 물 쇠 를 추가 하면 스 레 드 안전 을 실현 할 수 있 을 뿐만 아니 라 성능 도 큰 영향 을 받 지 않 습 니 다. 
방법 2:decorator 사용

#encoding=utf-8 
def singleton(cls): 
  instances = {} 
  def getInstance(): 
    if cls not in instances: 
      instances[cls] = cls() 
    return instances[cls] 
  return getInstance 
 
@singleton 
class SingletonClass: 
  pass 
 
if __name__ == '__main__': 
  s = SingletonClass() 
  s2 = SingletonClass() 
  print s 
  print s2 
 
스 레 드 도 안전 해 야 합 니 다.  
첨부:성능 이 높 을 수 없 음

import threading 
 
class Sing(object): 
  def __init__(): 
    "disable the __init__ method" 
 
  __inst = None # make it so-called private 
 
  __lock = threading.Lock() # used to synchronize code 
 
  @staticmethod 
  def getInst(): 
    Sing.__lock.acquire() 
    if not Sing.__inst: 
      Sing.__inst = object.__new__(Sing) 
      object.__init__(Sing.__inst) 
    Sing.__lock.release() 
    return Sing.__inst 

이상 은 Python 단일 사례 모델 의 사례 상세 한 설명 입 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 하 십시오.읽 어 주 셔 서 감사합니다. 여러분 께 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기