>  기사  >  백엔드 개발  >  Python의 싱글톤 패턴

Python의 싱글톤 패턴

黄舟
黄舟원래의
2017-02-04 16:38:191362검색

싱글턴 모드

싱글턴 모드 패턴)은 일반적으로 사용되는 소프트웨어 디자인 패턴입니다. 이 패턴의 주요 목적은 특정 클래스의 인스턴스가 하나만 존재하도록 하는 것입니다. 싱글톤 개체는 특정 클래스의 인스턴스 하나만 전체 시스템에 나타나도록 하려는 경우 유용합니다.

예를 들어 서버 프로그램의 구성 정보는 파일에 저장되고 클라이언트는 AppConfig를 전달합니다. 구성 파일 정보를 읽는 클래스입니다. 프로그램을 실행하는 동안 구성 파일의 내용을 사용해야 하는 곳이 여러 곳이라면, 즉 AppConfig를 여러 곳에서 생성해야 합니다. 개체 인스턴스 - 시스템에 여러 AppConfig 인스턴스 개체가 존재하게 되어 특히 구성 파일에 많은 콘텐츠가 포함된 경우 메모리 리소스가 심각하게 낭비됩니다. 실제로 AppConfig와 같은 것 이러한 클래스의 경우 프로그램이 실행되는 동안 인스턴스 개체가 하나만 존재하기를 바랍니다.

Python에서는 다양한 방법을 사용하여 싱글톤 패턴을 구현할 수 있습니다.

  • 모듈 사용

  • _ 사용 _new__

  • 데코레이터 사용

  • 메타클래스 사용

모듈 사용

사실 Python 모듈은 자연스러운 싱글톤 모드입니다. 모듈을 처음 가져올 때 .pyc가 생성되기 때문입니다. 파일을 두 번째로 가져오면 .pyc가 직접 로드됩니다. 모듈 코드를 다시 실행하지 않고 파일을 삭제하세요. 따라서 싱글톤 객체를 얻으려면 모듈에서 관련 함수와 데이터만 정의하면 됩니다. 정말로 싱글톤 클래스를 원한다면 다음을 고려해보세요:

# 
mysingleton.py
class My_Singleton(object):
    def foo(self):
        pass
 
my_singleton = My_Singleton()

위의 코드를 mysingleton.py 파일에 저장하고 다음과 같이 사용하세요:

from 
mysingleton import my_singleton
 
my_singleton.foo()

__new__ 사용

클래스의 인스턴스를 하나만 표시하려면 __new__를 사용하여 인스턴스 생성 프로세스를 제어할 수 있습니다.

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kw):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  
        return cls._instance  
 
class MyClass(Singleton):  
    a = 1

위 코드에서 클래스의 인스턴스는 클래스 변수 _instance와 연결됩니다. cls._instance가 None이면 인스턴스가 생성되고, 그렇지 않으면 직접 반환됩니다. cls._instance.

실행은 다음과 같습니다:

>>> one = MyClass()
>>> two = MyClass()
>>> one == two
True
>>> one is two
True
>>> id(one), id(two)
(4303862608, 4303862608)

데코레이터 사용

우리는 데코레이터가 클래스나 함수의 기능을 동적으로 수정할 수 있다는 것을 알고 있습니다. 여기서는 하나의 인스턴스만 생성할 수 있도록 데코레이터를 사용하여 클래스를 장식할 수도 있습니다. 코드는 다음과 같습니다.

from 
functools import wraps
 
def singleton(cls):
    instances = {}
    @wraps(cls)
    def getinstance(*args, **kw):
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return getinstance
 
@singleton
class MyClass(object):
    a = 1

위에서 우리는 내부 함수 getinstance를 반환하는 데코레이터 싱글톤을 정의했습니다. 함수는 클래스가 사전 인스턴스에 있는지 확인합니다. , 존재하지 않는 경우 cls가 키로 사용되고 cls(*args, **kw)는 인스턴스에 값으로 저장됩니다. 그렇지 않으면 직접 반환됩니다. 인스턴스[cls].

메타클래스 사용

메타클래스는 클래스 생성 과정을 제어할 수 있으며 주로 세 가지 작업을 수행합니다.

  • 클래스 생성. 차단 클래스

  • 클래스 정의 수정

  • 수정된 클래스 반환

코드 메타클래스를 사용하여 싱글톤 패턴을 구현하는 방법은 다음과 같습니다.

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]
 
# 
Python2
class MyClass(object):
    __metaclass__ = Singleton
 
# 
Python3
# 
class MyClass(metaclass=Singleton):
#    pass


요약

Python 모듈은 자연스러운 싱글톤 패턴이어야 합니다. 물론 대부분의 경우 데코레이터나 메타클래스와 같은 메서드를 사용할 수도 있습니다.


위는 Python의 싱글톤 모드 내용입니다. PHP 중국어 홈페이지(www.php.cn)를 주목해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Python 정규식다음 기사:Python 정규식