HOWTO · Python

Python의 싱글톤 디자인 패턴

이 튜토리얼은 Python에서 싱글톤 디자인 패턴의 구현을 보여줍니다.

이 페이지의 내용

디자인 패턴은 문제를 해결하기 위한 일부 코드를 나타낼 수 있습니다. Singleton은 그러한 디자인 패턴 중 하나이며 Python에서 클래스의 다른 개체를 만들 수 있습니다.

이 패턴은 주어진 클래스의 하나의 객체만 제한합니다. Python에서 이 패턴을 시뮬레이션하는 몇 가지 방법이 있습니다.

데코레이터를 사용하여 Python에서 싱글톤 디자인 패턴 구현

Python의 데코레이터는 다른 함수와 객체를 인수로 받아 동작을 수정할 수 있는 함수입니다. 데코레이터를 사용하려면 @ 기호를 사용합니다.

Singleton 디자인 패턴을 구현하는 데 사용할 수 있습니다.

다음 예를 참조하십시오.

def singleton_dec(class_):
    instances = {}

    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]

    return getinstance


@singleton_dec
class Sample:
    def __init__(self):
        print("Object created.")


x = Sample()
y = Sample()
print(x, y)

출력:

Object created.
<__main__.Sample object at 0x0000015E72D3CA48> <__main__.Sample object at 0x0000015E72D3CA48>

위의 예에서 전체 클래스를 인수로 사용하는 데코레이터를 만들었습니다. 이 데코레이터를 사용하면 xy의 위치로 확인할 수 있는 Singleton 개체를 구현할 수 있습니다.

Singleton에 데코레이터를 사용할 때의 단점은 Sample 최종 클래스가 함수가 되어 클래스 메서드를 사용할 수 없다는 것입니다.

기본 클래스를 사용하여 Python에서 싱글톤 디자인 패턴 구현

기본 클래스는 다른 클래스를 파생시키는 특수 클래스입니다. 이 기본 클래스의 인스턴스가 생성되지 않습니다.

기본 클래스를 사용하여 Python에서 Singleton에 대한 구조를 제공할 수 있습니다.

예를 들어,

class Singleton_base(object):
    _instance = None

    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance


class Sample1(Singleton_base):
    def __init__(self):
        print("Object created.")


x = Sample1()
y = Sample1()
print(x, y)

출력:

Object created.
Object created.
<__main__.Sample object at 0x0000015E72D3F388> <__main__.Sample object at 0x0000015E72D3F388>

이것은 효과적인 방법입니다. 그러나 다중 상속으로 인해 여러 클래스가 관련된 경우 오류가 발생할 수 있습니다.

메타클래스를 사용하여 Python에서 싱글톤 디자인 패턴 구현

메타클래스는 클래스 객체의 동작을 정의할 수 있기 때문에 파이썬에서 매우 흥미로운 기능입니다. 수업을 위한 수업이라고 할 수 있습니다.

Python 2에서는 클래스에 __metaclass__ 속성을 추가합니다. Python 3에서는 클래스의 인수로 추가할 수 있습니다.

이 기능을 사용하여 Python에서 Singleton 디자인을 구현할 수 있습니다.

예를 들어,

class Singleton_meta(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton_meta, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class Sample(metaclass=Singleton_meta):
    def __init__(self):
        print("Object created.")


x = Sample()
y = Sample()
print(x, y)

출력:

Object created.
<__main__.Sample object at 0x0000015E72D3FF88> <__main__.Sample object at 0x0000015E72D3FF88>

이것은 메타 클래스의 적절한 적용이며 자동 상속을 달성합니다.

모듈을 사용하여 Python에서 싱글톤 디자인 패턴 구현

아마도 Python에서 Singleton의 가장 쉽고 기본적인 구현은 모듈을 사용하는 것입니다.

우리는 파이썬으로 모듈을 만들 수 있다는 것을 알고 있습니다. 기능만 포함된 모듈은 싱글톤 역할을 할 수 있으며, 이는 이러한 모든 기능을 모듈에 바인딩하기 때문입니다.