TEL. 053-453-6585
OPEN&CLOSE.  9:00~19:00
CLODED SHOP.  MONDAY
 
 
 

파이썬 싱글톤 예제

2019年8月3日

Singleton의 후계자인 경우 모든 인스턴스는 Singleton의 인스턴스이기도 하여 상태를 공유해야 합니다. 그러나 이것은 다음 코드에서 설명한 대로 작동하지 않습니다: Singleton 디자인 패턴은 가장 간단하고 가장 유명한 크리에이션 디자인 패턴 중 하나입니다. 지정된 개체의 단일 인스턴스와 개체에 대한 전역 액세스 지점만 가질 수 있는 방법을 제공합니다. 여러 인스턴스가 동일한 로그 파일을 수정하려고 하거나 동일한 데이터베이스 엔터티를 수정하려는 여러 데이터베이스 커넥터와 같이 일관되지 않은 상태 또는 충돌하는 요청이 발생하는 경우 유용합니다. 이 레시피는 Singleton._ _impl 내부 클래스를 한 번만 만드는 클래스로 사용합니다. 내부 클래스는 파이썬에서 특별하거나 마법적인 것은 아니며 Java와 는 매우 다르며 C ++와 비슷합니다. 그들은 단지 다른 클래스의 본문에 자신의 클래스 문을 가지고 일어나는 클래스입니다. 그러나 아래 [3]에서 볼 수 있듯이 파이썬은 __new___(_new___)의 형식 메서드를 다시 할당할 수 없으며 좋은 이유가 있습니다. 이것은 SingletonPattern.py 것과 동일한 효과를 가지지만 더 우아합니다.

전자의 경우 Singleton 동작을 각 클래스에 연결해야 하지만 보그는 상속을 통해 쉽게 재사용할 수 있도록 설계되었습니다. 물론 내부 클래스는 파이썬의 모든 것과 같이 실제로 숨겨져 있지 않습니다. 하지만 싱글톤에 침입하기 위해 추가 노력을 투자해야합니다. 사실, 파이썬에서 모듈을 가져올 때마다 Singleton 패턴을 사용하고 있습니다. 기본적으로 모듈을 가져올 때 Python은 요청된 모듈이 이미 가져왔는지 여부를 검사하기 때문입니다. 이 경우 해당 개체를 반환합니다. 그렇지 않으면 가져오고 초기화합니다. 물론, 내부 클래스는 파이썬의 거의 모든 것과 마찬가지로 실제로 숨겨져 있지 않습니다. 악의적인 액세스 시도로부터 보호해야 하는 경우 rexec 및 Bastion 표준 모듈을 사용하고 제한된 실행 샌드박스에 의존해야 합니다(그러나 이것은 신뢰할 수 없는 코드(예: 수신한 코드)를 실행해야 하는 경우에만 필요합니다. n 알 수 없는 출처). 우리는 싱글 톤 패턴이 유용하고 또한 그것을 구현하는 다른 방법을 보여 주었다 설명했다.

이제 다른 창작물 패턴을 탐색할 준비가 되었습니다. 위키백과에서는 많은 예제가 제공되지만 파이썬에서 다른 예제를 공유하고 싶습니다. 파이썬의 메타 클래스에 대한 보다 자세한 소개를 보려면 여기를 살펴보십시오. 우리가 전에 여러 번 반복했듯이, 파이썬의 모든 것은 객체이며 이것은 클래스 정의를 포함합니다. 따라서 형식이 있어야 합니다. 아래 예에서 짝수 유형은 `type`입니다. 형식은 기본 제공 클래스조차도 인스턴스인 메타클래스입니다. 1234567891011111213141516171181920fromfunctools 가져오기 wraps__인스턴스 = {}def 싱글톤(cls): @wraps(cls) def getInstance(*args, **kwargs): 인스턴스 = 인스턴스 = cls.get(cls, 없음) 인스턴스 반환 인스턴스 반환 getInstance@singletonclass MySingleton: def foo(self): passMySingleton().foo() 알렉스 마르텔리는 싱글톤으로 우리가 정말로 원하는 것은 모든 개체에 대한 단일 상태 데이터 집합을 가지는 것이라는 관측을 합니다.

즉, 원하는 만큼 많은 개체를 만들 수 있으며 모두 동일한 상태 정보를 참조하면 Singleton의 효과를 얻을 수 있습니다. 그는 모든 __dict__s를 동일한 정적 저장소 조각으로 설정하여 수행되는 보그 [1]이라고 부르는 것을 사용하여 이 작업을 수행합니다. 두 번째 접근 법은 메타 클래스를 사용, 내가 아직 이해하지 못하지만 매우 흥미롭고 강력한 보이는 주제 (파이썬 2.2는 메타 클래스 구문을 개선 / 단순화하고, 그래서이 예제는 변경 될 수 있습니다) : 개인 생성자의 옵션 이후 파이썬에서 존재하지 않는, 우리는 다른 방법으로 구현합니다.

コメント