Python의 싱글톤 디자인 패턴

Manav Narula 2023년1월30일
  1. 데코레이터를 사용하여 Python에서 싱글톤 디자인 패턴 구현
  2. 기본 클래스를 사용하여 Python에서 싱글톤 디자인 패턴 구현
  3. 메타클래스를 사용하여 Python에서 싱글톤 디자인 패턴 구현
  4. 모듈을 사용하여 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의 가장 쉽고 기본적인 구현은 모듈을 사용하는 것입니다.

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

작가: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn