단단한 파이썬 8장 : Enum 사용하기

    들어가기 전

    자바에서 Enum을 이용해서 효율적인 코딩을 할 수 있는 것처럼 파이썬에서도 Enum 클래스가 지원되기 시작했다. 사용법이 자바와는 조금 다른데, Enum 클래스를 사용하는 방법의 기초를 터득해보고자 한다. 

    요약하면 다음과 같다.

    • Enum을 이용해서 타입을 표현할 수 있음.
    • Enum을 이용해 인스턴스들을 표현할 수 있으며, 람다 함수와 함께 이용하면 응집력 있게 다형성을 구현할 수 있음. 
    • Enum을 이용해 타입을 표현할 수 있기 때문에 typing 라이브러리와 함께 사용했을 때, 파이썬을 좀 더 단단하게 만들 수 있음. (타입 힌트를 줄 수 있기 때문임) 
    • https://github.com/chickenchickenlove/solid-python/tree/main/chapter8

     


    Enum을 사용하는 방법

    from enum import Enum
    
    class Animal(Enum):
    	...
    • 파이썬은 라이브러리 형태로 Enum을 제공해준다.
    • Enum 클래스를 상속받으면 해당 클래스를 Enum처럼 사용할 수 있게 된다. 

    Enum 인스턴스 객체 초기화

    class Animal(Enum):
    
        # Enum 클래스에 인스턴스로 생성됨.
        DOG = ('Dog', lambda: print('bark'))
        CAT = ('Cat', lambda: print('meow'))
        PIG = ('Pig', lambda: print('Ggul'))
    
        # 생성될 때는 생성자가 호출됨. 이 때, 필요한 값을 넣어줄 수 있음.
        def __new__(cls, name, func):
            obj = object.__new__(cls)
            obj._value_ = name # Enum은 _value_를 가지고 있음. 내부적으로 _value_는 self.value로 바꾸어짐.
            obj.action = func
            return obj
    • Enum 클래스를 상속받은 클래스, 즉 새로운 Enum 클래스를 정의할 때 멤버 변수처럼 Enum 멤버를 선언할 수 있다. 
    • 자바에서 Enum 멤버들이 그 타입의 인스턴스인 것처럼 파이썬의 Enum 멤버들 역시 그 타입의 인스턴스다. 

    파이썬 스크립트가 실행되면 위에서부터 값을 읽어오기 시작한다. Animal 클래스에는 DOG / CAT / PIG라는 3개의 멤버가 존재하는데, __new__() 메서드가 호출되면서 DOG, CAT, PIG가 생성된다. 몇 가지 알아두면 좋은 부분은 다음과 같다.

    • object.__new__(cls)의 수행 결과로 cls 타입의 인스턴스가 생성됨.
      • 생성된 인스턴스에 멤버 변수들을 설정할 수 있음. 
    • Enum 클래스는 _value_를 가지고 있음. 이 값은 추후에 self.value로 접근할 수 있음. 
    • Enum 멤버 인스턴스에 튜플로 지정한 값은 __new__() 메서드 호출 시 매개변수로 전달됨. 
    • Enum 멤버 인스턴스에 튜플로 지정한 값은 '불변'을 상징하기 위함임. 

     


    Enum 클래스 전체 구현

    class Animal(Enum):
    
        # Enum 클래스에 인스턴스로 생성됨.
        DOG = ('Dog', lambda: print('bark'))
        CAT = ('Cat', lambda: print('meow'))
        PIG = ('Pig', lambda: print('Ggul'))
    
        # 생성될 때는 생성자가 호출됨. 이 때, 필요한 값을 넣어줄 수 있음.
        def __new__(cls, name, func):
            obj = object.__new__(cls)
            obj._value_ = name # Enum은 _value_를 가지고 있음. 내부적으로 _value_는 self.value로 바꾸어짐.
            obj.action = func
            return obj
    
        def action(self):
            self.action()
    
        def get_value(self):
            return self.value #
    
        def __str__(self):
            return self.value

    위 코드는 Animal을 이용한 Enum 인스턴스 전체를 구현한 것이다. 

    • Enum은 어떤 타입이 있을지 정해진 경우에 사용하면 됨. 이 때, 필요한 변수뿐만 아니라 함수까지 지정할 수 있음.
    • 함수 객체를 넘겨주면 Enum으로도 응집력 있게 다형성을 구현할 수 있음. 

     


    Enum 클래스는 Iterator가 구현되어 있음.

    for a in Animal:
        print(a)
    >>>
    Dog
    Cat
    Pig

    Enum 클래스는 Iterator가 구현되어있음. 따라서 For문에 사용하면 자동적으로 Iterating 됨. 

     


    Typing을 이용해 Enum을 Collection으로 표현하기

    from enum import Enum
    from typing import List
    
    
    class Animal(Enum):
    	DOG..
        
    def do_function(my_list: List[Animal]):
        for m in my_list:
            m.action()
    • 파이썬에서 Enum은 클래스를 통해서 구현되었다. 따라서 특정 타입을 가지는 것으로 볼 수 있으며, 이에 따라 typing 라이브러리를 이용하면 타입 힌트를 줄 수 있음.
    • 위의 do_function() 메서드에서는 List[Animal]을 이용해서 타입 힌트를 줌
      • m.action()이 자동적으로 IDE에서 나올 수 있음. 

    댓글

    Designed by JB FACTORY