본문 바로가기

파이썬

파이썬 간단한 싱글톤(singleton) 클래스 만들기

class test:
    pass


t1 = test()
t2 = test()

print(t1)
print(t2)

간단한 test 클래스를 만들고, 

t1 = test()     첫번째 테스트 객체 생성

t2 = test()     두번째 테스트 객체 생성

<__main__.test object at 0x030D28E0>
<__main__.test object at 0x030D28F8>

그 후, print 로 출력 해보니 할당된 주소가 나옵니다. 주소가 다르네요. 두개의 test 객체가 생성 되었습니다. 

 


class test:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_ins"):
            print("CREATE TEST CLASS")
            cls._ins = super().__new__(cls)

        return cls._ins

t1 = test()
t2 = test()

print(t1)
print(t2)

__new__ 라는 메소드가 추가 되었습니다.

 

 

def __new__(cls, *args, **kwargs):

파이썬에서는 아래 __new__ 메소드에서 객체를 생성합니다. 보통은 알아서 __new__ 메소드를 생성하여 객체를 생성하지만 오버라이드를 통해 직접 객체 생성에 관여 할 수 있습니다.

 

 

if not hasattr(cls, "_ins"):
    print("CREATE TEST CLASS")
    cls._ins = super().__new__(cls)

return cls._ins

이부분이 중요합니다. _ins 라는 변수명이 있는지 확인 하여 없다면 객체생성을 하여 _ins 라는 변수에 저장합니다.

최초 생성시에는 _ins 를 선언하지 않았으니 당연히 객체 생성이 이루어 질것입니다.

하지만 두번째 부터는 이미 선언된 _ins 를 리턴만 할 것입니다.

 

 

<__main__.test object at 0x02E22B08>
<__main__.test object at 0x02E22B08>

그 후, print 로 출력 해보니 할당된 주소가 나옵니다. 주소가 같네요. 하나의 생성된 객체를 공유하고 있습니다.