python 으로 단일 모드 를 실현 하 는 몇 가지 방법

1741 단어 python
1.사용 류 의new__방법.
#   __new__  ,python  
class Singleton(object):
    def __new__(cls, *args, **kwargs):
        #        _instance   __new__  ,python  
        if not hasattr(cls, "_instance"):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kwargs)
        return cls._instance

hasattr 반사 기술 을 이용 하여 있 는 지 여 부 를 판단 합 니 다instance 속성,없 으 면 object 의 호출new__방법 은 개인 변수 에 대상 할당 값 을 만 듭 니 다.
사용 방법
단일 모드 가 필요 한 클래스 를 이 클래스 를 계승 하면 됩 니 다.
#        
class MyClass(Singleton):
    pass

2、장식 기 사용
패 킷 을 이용 하여 장식 기 를 정의 합 니 다.
#      
def singletonDecor(cls):
    #          
    instance = {}
    def getInstance(*args, **kwargs):
        if cls not in instance.keys():
            instance[cls] = cls(*args, **kwargs)
    return getInstance

정 의 된 클래스 가 존재 하 는 대상 인 스 턴 스 사전 인지,존재 하지 않 으 면 대상 을 만 듭 니 다.
사용 방법
@singletonDecor
class MyTest3():
    pass

하나의 예 가 필요 한 클래스 에 장식 기 를 추가 하면 됩 니 다.
3.장식 기 를 사용 하여 라인 이 안전 합 니 다.
#          
from functools import wraps
from threading import RLock


def singleton(cls):
    """          """
    instances = {}
    locker = RLock()

    @wraps(cls)
    def wrapper(*args, **kwargs):
        if cls not in instances:
            with locker:
                if cls not in instances:
                    instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper

RLock 을 도입 하여 대상 을 만 들 때 자 물 쇠 를 추가 합 니 다.@wraps(cls)의 역할 은 장식 기 에 수 식 된 함수 의 구조 가 변 하지 않도록 하 는 것 입 니 다.예 를 들 어 장식 기 에 수 식 된 함수__name__의 값 이 변 하지 않도록 하 는 등 입 니 다.

좋은 웹페이지 즐겨찾기