Message의 구현은 Union으로 하게 된다면 메서드 상속을 이용할 수 없습니다. 예를 들어
from fieldenum import fieldenum, Variant, Unit
@fieldenum
class Message:
Quit = Unit
Move = Variant(x=int, y=int)
Write = Variant(str)
ChangeColor = Variant(int, int, int)
def process(self):
...
위와 같이 .process 메서드를 추가하면 모든 배리언트들에 대해 .process() 메서드를 사용할 수 있습니다.
# Message.process() 메서드를 각 배리언트에서 사용 가능
Message.Quit.process()
Message.Move(x=123, y=456).process()
Message.Write("hello, world").process()
Message.ChangeColor(123, 000, 89).process()
또한 제가 설명드린 repr는 '해당 enum의 배리언트로서의 repr'를 의미한 것입니다.
예를 들어 fieldenum을 repr를 감싸 호출하면 다음과 같이 실행됩니다.
커스텀 __repr__가 없으면 Message enum의 하위 배리언트라는 사실이 표현되지 않습니다.
Quit은 유닛 배리언트로 호출 없이 사용합니다.
Message.Quit # 별도의 호출 (예: `Message.Quit()`) 없이 사용 가능
또한 호출을 사용해야 하는 배리언트 종류인 fieldless 배리언트의 경우에는 싱글톤으로서 is 연산자로 확인할 수 있습니다.
from fieldenum import fieldenum, Variant, Unit
class WithFieldless:
Fieldless = Variant()
assert WithFieldless.Fieldless() is WithFieldless.Fieldless()
fieldenum을 사용하면 이렇게 놓치기 쉬운 다양한 구현 디테일을 자동으로 챙기는 데에 도움이 됩니다.
Message의 구현은 Union으로 하게 된다면 메서드 상속을 이용할 수 없습니다. 예를 들어위와 같이
.process메서드를 추가하면 모든 배리언트들에 대해.process()메서드를 사용할 수 있습니다.또한 제가 설명드린 repr는 '해당 enum의 배리언트로서의 repr'를 의미한 것입니다.
예를 들어 fieldenum을 repr를 감싸 호출하면 다음과 같이 실행됩니다.
커스텀
__repr__가 없으면Messageenum의 하위 배리언트라는 사실이 표현되지 않습니다.Quit은 유닛 배리언트로 호출 없이 사용합니다.또한 호출을 사용해야 하는 배리언트 종류인 fieldless 배리언트의 경우에는 싱글톤으로서
is연산자로 확인할 수 있습니다.fieldenum을 사용하면 이렇게 놓치기 쉬운 다양한 구현 디테일을 자동으로 챙기는 데에 도움이 됩니다.