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를 감싸 호출하면 다음과 같이 실행됩니다.

print(repr(Message.Move(x=123, y=456)))  # Message.Move(x=123, y=456)  

커스텀 __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을 사용하면 이렇게 놓치기 쉬운 다양한 구현 디테일을 자동으로 챙기는 데에 도움이 됩니다.