단단한 파이썬 8장 : Enum 사용하기
- 프로그래밍 언어/파이썬
- 2023. 9. 14.
들어가기 전
자바에서 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에서 나올 수 있음.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
단단한 파이썬 3. 타입 어노테이션 (1) | 2023.10.08 |
---|---|
전문가를 위한 파이썬 7. 함수 데코레이터와 클로저 (1) | 2023.10.06 |
Python : asyncio의 시작과 종료 (0) | 2023.02.19 |
Python : 비동기 이터레이터, 비동기 제네레이터 (0) | 2023.02.18 |
Python : async with를 이용한 asyncContextManager 사용 (0) | 2023.02.17 |