EASY PEASY CODING

[파이썬] Singleton Pattern 본문

Python/Basic

[파이썬] Singleton Pattern

richpotato 2023. 10. 13. 17:44

싱글톤 패턴(Singleton Pattern)

class SingletonClass:
    inst = None
    
    def __new__(cls):
        if cls.inst is None:
            cls.inst = object.__new__(cls)
        return cls.inst
        
    def aa(self):    
        print('난 메소드야')

위 코드에서 SingletonClass는 싱글톤 패턴을 구현한 클래스입니다. 이 클래스는 inst라는 클래스 레벨 변수를 가지고 있습니다. __new__ 메서드를 오버라이드하여 이미 인스턴스가 존재하는지 확인하고, 존재하지 않는 경우에만 새로운 인스턴스를 생성합니다.

 

+) cls는 파이썬에서  "클래스(self)"의 약자로, 클래스 내부에서 클래스 자신을 가리키는 역할을 합니다.
__new__ 메서드는 클래스 메서드이기 때문에 첫 번째 매개변수로 자신을 나타내는 cls가 전달됩니다. 

따라서 cls.inst는 클래스 레벨의 변수 inst를 가리킵니다.

이 메서드는 객체를 생성할 때 호출되며, 새로운 객체를 만들어 반환합니다. 일반적으로 __new__는 __init__ 메서드보다 먼저 호출되어 객체를 초기화합니다. 그래서 __new__에서 객체를 생성하고 초기 상태를 설정한 뒤, __init__에서 추가적인 초기화 작업을 수행하는 것이 일반적입니다.
따라서 주로 __new__ 메서드는 객체의 생성 방식을 제어하고, 특별한 경우에만 객체를 생성하거나 새로운 객체를 반환하는 역할을 합니다.

 

 

class SubClass(SingletonClass):
    pass

SubClass는 SingletonClass를 상속받은 클래스입니다. 이 클래스도 싱글톤 패턴을 따릅니다. 따라서 SubClass의 인스턴스를 생성해도 이미 생성된 인스턴스가 반환됩니다.

 

 

클래스의 멤버 변수를 고정

class Ani:
    __slots__ = ['irum','nai']    
    def printData(self):
        print(self.irum,self.nai)

Ani 클래스에서는 __slots__를 사용하여 클래스의 멤버 변수를 고정시킵니다. 이 경우에는 irum과 nai만 허용됩니다. 따라서 다른 속성을 추가하려고 하면 에러가 발생합니다.

 

a= Ani()
a.irum='호랑이'
a.nai=3
a.eat='치킨'  # 에러 발생: 'Ani' object has no attribute 'eat'
a.printData()  # 출력: 호랑이 3

a 객체를 생성하고 irum과 nai 속성을 할당한 뒤, printData 메서드를 호출하여 결과를 확인할 수 있습니다.