상세 컨텐츠

본문 제목

[Python] 데코레이터(Decorator)를 이용한 Singleton Pattern 구현

개발/Back-end

by 맹수자두 2024. 6. 1. 10:29

본문

데코레이터를 사용하여 싱글톤 패턴을 구현할 수 있습니다. 데코레이터는 함수나 클래스를 감싸는 역할을 하기 때문에 싱글톤 인스턴스를 생성하고 관리하는 데 적합합니다.


데코레이터를 사용한 싱글톤 패턴 구현

def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class Singleton:
    def __init__(self, value):
        self.value = value

# 싱글톤 인스턴스 생성
singleton1 = Singleton('First Instance')
print(singleton1.value)  # 출력: First Instance

# 또 다른 싱글톤 인스턴스 생성 시도
singleton2 = Singleton('Second Instance')
print(singleton2.value)  # 출력: First Instance

# 두 객체가 동일한 객체인지 확인
print(singleton1 is singleton2)  # 출력: True



설명

  • 'singleton' 데코레이터 : 'singleton' 함수는 클래스를 인수로 받아 'get_instance' 함수를 반환합니다. 이 함수는 클래스의 인스턴스가 이미 존재하는지 확인하고, 없으면 새 인스턴스를 생성하여 반환합니다.
  • '@singleton` 데코레이터 : 'Singleton' 클래스 위에 '@singleton' 데코레이터를 사용하여, 이 클래스가 싱글톤 패턴을 따르도록 합니다.

장점

  • 간결성 : 메타클래스를 정의하는 것보다 데코레이터를 사용하는 방식이 더 간결하고 직관적일 수 있습니다.
  • 재사용성 : 데코레이터를 사용하면 여러 클래스를 쉽게 싱글톤으로 만들 수 있습니다.
  • 유연성 : 기존 클래스에 쉽게 싱글톤 기능을 추가할 수 있습니다.

 

데코레이터와 메타클래스는 모두 파이썬에서 클래스를 수정하거나 확장하는 데 사용되지만, 그 목적과 사용 방식에는 몇 가지 중요한 차이점이 있습니다. 아래에서 각각의 개념을 설명하고 그 차이점을 정리하겠습니다.

 

데코레이터

데코레이터는 함수나 클래스를 감싸는 또 다른 함수입니다. 데코레이터는 클래스나 함수의 동작을 수정하거나 확장하는 데 주로 사용됩니다.

 

데코레이터의 특징

  • 단순함 : 데코레이터는 함수나 클래스에 추가 기능을 부여하는 매우 간단한 방법입니다.
  • 유연성 : 데코레이터는 다양한 기능을 쉽게 추가할 수 있습니다. 로깅, 접근 제어, 메타데이터 추가 등 다양한 용도로 사용할 수 있습니다.
  • 적용 범위 : 데코레이터는 개별 함수나 클래스에 적용됩니다.


메타클래스

메타클래스는 클래스를 생성하는 클래스입니다. 파이썬의 모든 클래스는 `type`이라는 메타클래스의 인스턴스입니다. 메타클래스를 사용하면 클래스의 생성과 초기화를 제어할 수 있습니다.

 

메타클래스의 특징

  • 강력함 : 메타클래스는 클래스 생성 자체를 제어할 수 있어, 매우 강력한 기능을 제공합니다.
  • 클래스 레벨 조작 : 메타클래스는 클래스의 속성, 메서드 등을 조작할 수 있습니다. 이를 통해 클래스의 동작을 광범위하게 수정할 수 있습니다.
  • 적용 범위 : 메타클래스는 클래스를 정의할 때 지정되며, 해당 클래스 및 그 서브클래스에 적용됩니다.

차이점 요약

  1. 적용 범위
    1. 데코레이터 : 개별 클래스나 함수에 적용됩니다. 특정 클래스나 함수에 쉽게 기능을 추가할 수 있습니다.
    2. 메타클래스 : 클래스 생성 시점에 적용됩니다. 클래스 및 그 모든 서브클래스에 영향을 미칩니다.
  2. 복잡도
    1. 데코레이터 : 구현이 비교적 단순하고 직관적입니다. 함수나 클래스의 동작을 간단히 수정할 수 있습니다.
    2. 메타클래스 : 구현이 복잡할 수 있으며, 클래스 생성 및 초기화 과정을 깊이 있게 제어할 수 있습니다.
  3. 강력함
    1. 데코레이터 : 특정 기능을 추가하거나 수정하는 데 매우 유용하지만, 클래스 생성 자체를 제어하지는 않습니다.
    2. 메타클래스 : 클래스의 생성과 초기화, 상속 등을 포함한 광범위한 동작을 제어할 수 있습니다.
  4. 유연성
    1. 데코레이터 : 여러 개의 데코레이터를 체인처럼 연결하여 사용할 수 있어 유연합니다.
    2. 메타클래스 : 하나의 클래스에 한 번에 하나의 메타클래스만 적용할 수 있습니다. 다중 메타클래스를 사용하려면 '__metaclass__' 속성을 직접 설정해야 합니다.


데코레이터와 메타클래스는 각각의 상황에 맞게 사용될 수 있으며, 필요에 따라 적절한 방법을 선택하면 됩니다. 데코레이터는 간단한 수정 및 확장이 필요할 때, 메타클래스는 클래스 생성 과정 자체를 제어해야 할 때 유용합니다.

 

ref

https://tuu-lx.tistory.com/11

 

[Python] Metaclass를 이용한 Singleton Pattern 구현

파이썬에서 싱글톤 패턴을 구현하는 가장 효과적이고 효율적인 방법 중 하나는 메타클래스를 사용하는 것입니다. 메타클래스를 사용하면 싱글톤 패턴을 더 깔끔하게 구현할 수 

tuu-lx.tistory.com

 

관련글 더보기