StatCounter - Free Web Tracker and Counter

단단한 파이썬 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