>백엔드 개발 >파이썬 튜토리얼 >파이썬 싱글턴 패턴이란?

파이썬 싱글턴 패턴이란?

(*-*)浩
(*-*)浩원래의
2019-05-23 10:39:279523검색

파이썬에서 싱글톤 모드는 일반적으로 사용되는 소프트웨어 디자인 패턴입니다. 이 모드의 주요 목적은 특정 클래스가 메모리에 하나의 인스턴스 객체만 가질 수 있도록 하는 것입니다. 싱글톤 모드 메서드를 통해 생성된 클래스가 현재 프로세스에 있습니다. . 여기에는 인스턴스 개체가 하나만 있습니다. 싱글톤 패턴은 다음과 같이 구분됩니다. 1. 클래스가 로드되자마자 객체를 생성하는 게으른 스타일 2. 사용될 때만 객체를 생성하는 Hungry 스타일.

파이썬 싱글턴 패턴이란?

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

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

싱글턴 패턴에는 세 가지 주요 사항이 있습니다. 첫째, 클래스는 인스턴스를 하나만 가질 수 있습니다. 둘째, 이 인스턴스를 자체적으로 생성해야 합니다. 셋째, 이 인스턴스를 자체적으로 전체 시스템에 제공해야 합니다.

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

모듈 사용

__new__ 사용

데코레이터 사용

모듈 사용

사실 Python 모듈은 Natural 싱글톤 패턴입니다.

모듈을 처음 가져올 때 .pyc 파일이 생성되기 때문에 두 번째로 가져올 때는 모듈 코드를 다시 실행하지 않고 .pyc 파일이 직접 로드됩니다. 따라서 싱글톤 객체를 얻으려면 관련 함수와 데이터를 모듈에 정의하기만 하면 됩니다.

정말로 싱글톤 클래스를 원한다면 다음을 고려하세요:

#tests1.py
class MyClass(object):
    def foo(self):
        print('MyClass.foo')
my_class_obj=MyClass()

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

from .tests1 import my_class_obj
my_class_obj.foo()

Use __new__

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

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

위 코드에서 클래스의 인스턴스를 클래스 변수 _instance와 연결합니다. 없음이면 인스턴스를 생성하고, 그렇지 않으면 cls._instance를 직접 반환합니다.

실행은 다음과 같습니다:

one = HerClass()
two = HerClass()
print(one == two)   #True
print(one is two)   #True
print(id(one), id(two)) #42818864 42818864

Using decorators

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

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

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

위 내용은 파이썬 싱글턴 패턴이란?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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