ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python metaclasses, singleton pattern
    Software Development/Python 2020. 4. 10. 16:36

    메타클래스는 인스턴스가 클래스인 클래스입니다. "일반적인"클래스가 클래스의 인스턴스의 동작을 정의하는 것처럼 메타 클래스는 클래스의 동작과 인스턴스의 동작을 정의합니다.

     

    메타클래스는 모든 객체 지향 프로그래밍 언어에서 지원되진 않습니다. 메타클래스를 지원하는 프로그래밍 언어는 구현 방식에 따라 상당히 다릅니다.

     

    메타클래스를 사용하는 수 많은 용도가 있습니다. 몇가지만 말하자면 아래의 예를 들 수 있습니다.

    • 로깅 프로파일링
    • 인터페이스 검사
    • 생성시 클래스 등록
    • 자동으로 새로운 메소드 추가
    • 자동 속성 생성
    • 프록시
    • 리소스 자동 잠금/동기화

    원칙적으로 메타 클래스는 다른 파이썬 클래스와 마찬가지로 정의되지만 "type" 에서 상속되는 클래스입니다.

     

    다른 차이점은 메타 클래스를 사용하는 클래스 문장이 끝날메타 클래스가 자동으로 호출된다는 것입니다.

    , 클래스 헤더의 base classes(베이스 클래스도 없을 수 있음) 후에 "metaclass" 키워드가 전달되지 않으면 type() (i.e. __call__ 유형)이 호출됩니다.

     

    반면에 메타 클래스 키워드를 사용하는 경우, 그것에 할당된 클래스는 type 대신 호출됩니다.

     

    singleton pattern은 클래스의 인스턴스화를 하나의 객체로 제한하는 설계입니다. 정확히 하나의 객체가 필요할 때 사용됩니다. 

     

    이 컨셉은 인스턴스화에서 특정 또는 고정 된 수의 객체로 제한할 수 있습니다. 

    싱글톤은 수학에서 왔는데, unit set이라 불리는 singleton은 정확히 하나의 요소가 있는 집합에 사용됩니다.

    class Singleton(type):
        _instances = {}
        def __call__(cls, *args, **kwargs):
            if cls not in cls._instances:
                cls._instances[cls] = super(Singleton,                                      cls).__call__(*args, **kwargs)
            return cls._instances[cls]
        
        
    class SingletonClass(metaclass=Singleton):
        pass
    
    
    class RegularClass():
        pass
    
    
    x = SingletonClass()
    y = SingletonClass()
    print(x == y)
    
    
    x = RegularClass()
    y = RegularClass()
    print(x == y)
    

    True

    False

     

    출처: https://www.python-course.eu/python3_metaclasses.php

    댓글

Designed by Tistory.