Python에서 싱글톤이 필요합니까?

( Image (C) Tai Kedzierski )

개체 방향



객체 지향의 일반적인 예는 다음과 같습니다.
  • "자동차"( class Car )
  • 와 같이 수업에서 정의하는 사물의 개념이 있습니다.
  • Renault Laguna(new Car("Renault", "Laguna")와 같이 해당 개념과 관련된 유형 항목을 나타내는 클래스의 개체 인스턴스가 있습니다.

  • 이것은 의미가 있습니다. 우리는 모든 실제 자동차에 적용되는 운전 가능, 탈 수 있는 자동차 개념을 가지고 있습니다.

    객체지향의 언어에서 모든 것이 객체라는 말이 나오기 시작했습니다.

    이것은 실제 세계의 일부 시나리오에서 떨어집니다.

    Raspberry Pi에서 프로젝트를 진행 중이라고 가정해 보겠습니다. 그리고 Pi는 GPIO 보드에 액세스할 수 있습니다(단순화를 위해 보드가 있고 닫거나 열 수 있는 전기 회로가 있음). 임의적이지만 비합리적이지 않게 Pi에는 한 번에 한 세트의 GPIO 핀만 있다고 가정해 보겠습니다.

    하나씩 일어나는 것



    Java에서 이 작업을 수행하는 경우 class GpioBoard extends Singleton의 여러 인스턴스가 다르게 검색되고 구성되는 것을 원하지 않기 때문에 아마도 GpioBoard를 모델링할 것입니다. 프로그램의 다른 부분에서. 확장 효과Singleton는 클래스가 인스턴스화하려고 할 때 환경에서 반환할 기존 인스턴스를 확인하고 이미 존재하지 않는 경우에만 새 인스턴스를 생성함을 의미합니다.

    Python에서 이러한 접근 방식을 사용하면 implement the singleton pattern explicitly , 인스턴스화 및 호출이 필요한 클래스로 끝납니다.

    # FILE: gpio.py
    
    class GpioBoard(Singleton):
      _instance = None
    
      def __new__(cls):
        # From https://python-patterns.guide/gang-of-four/singleton/
        if cls._instance is None:
          print('Creating the object')
          cls._instance = super(Logger, cls).__new__(cls)
          # .... initialization code ...
        return cls._instance
    
      def set_pin(self, value):
        ... # implementation
    



    # FILE: main.py
    
    from gpio import GpioBoard
    
    board = GpioBoard()
    board.set_pin(1)
    


    모듈은 싱글톤입니다.



    하지만 여기에 문제가 있습니다. 파이썬에서는 모듈 자체가 싱글톤입니다. 다음 코드는 추가 코드 없이 정확히 동일합니다.

    # FILE: gpio.py
    
    def __setup():
        # .... initialization code ...
    
    def set_pin(value):
      ... # implementation
    
    # Single runtime entrypoint only gets executed once
    #  even from multiple imports of the same module
    __setup()
    



    # FILE: main.py
    
    import gpio
    
    # Immediately ready to use, would you look at that ...
    gpio.set_pin(1)
    


    코드가 훨씬 적습니다. 싱글톤 관리가 없습니다. 모듈은 고유한 싱글톤입니다.

    GPIO 확장 보드가 여러 개인 경우 어떻게 됩니까?



    또는 보다 일반적으로 아키텍처의 문제/설계에 대한 원래 이해에서 싱글톤이었던 항목이 더 이상 싱글톤이 아닌 경우 어떻게 됩니까?

    이 경우 아직 수행해야 할 재작업이 있을 수 있습니다. 아키텍처 변경으로 인해 기본 가정이 설계의 이후 반복에서 거짓이 될 수 있으며 한때 모듈 수준 변수 및 방법이었던 것을 일반 객체 지향 설계로 재작업하는 것은 약간(또는 거대한) 저글링 작업이 됩니다. 그리고 한 번 단순히 우리 라이브러리를 가져온 모든 것은 이제 클래스를 가져오고 개체를 명시적으로 인스턴스화하기 위해 업데이트해야 합니다.

    Python에서 싱글톤이 필요합니까?



    나는 실제로 질문에 단호하게 "아니오"를 전달하기 시작했습니다. "싱글톤이 (Python에서) 단일 인스턴스를 시행하는 것에 대한 해답입니까?"의 관점에서 보면: 아니오, 클래스 정의 없이 모듈 및 모듈 수준 메서드를 사용하는 것은 완벽하게 만족스럽습니다.

    하지만 저는 이 시점에서 확고한 예/아니오 대답이 없습니다. 아키텍처는 유동적이므로 처음부터 모든 것을 객체로 구현하고 필요에 따라 앞뒤로 de/singleton-ise할 수 있는 것이 합리적일 수 있습니다. YAGNI의 경우 싱글톤 패턴을 명시적으로 구현합니까? 누가 알아.

    좋은 웹페이지 즐겨찾기