싱글톤 패턴(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 메서드를 호출하여 결과를 확인할 수 있습니다.