python

【python】データクラスを継承したEnum

記事概要

dataclassを継承したEnumをについて、どうなってるんだろうと思ったので少し調べてみました。

下記python公式ドキュメントに例があったのでそれに沿って作ってみる
https://docs.python.org/ja/dev/howto/enum.html#dataclass-support

python 3.12.2

叩いてみる

@dataclass
class CreatureDataMixin:
    size: str
    legs: int
    tail: bool = field(default=True)

# dataclassを継承したEnum
class CreatureA(CreatureDataMixin, Enum):
    BEETLE = "small", 6
    DOG = "medium", 4

# 直接dataclassを代入したEnum
class CreatureB(Enum):
    BEETLE = CreatureDataMixin("small", 6)
    DOG = CreatureDataMixin("medium", 4)

>>> print(CreatureA.DOG)
>>> print(CreatureA.DOG)

<CreatureA.DOG: size='medium', legs=4, tail=True>
<CreatureB.DOG: CreatureDataMixin(size='medium', legs=4, tail=True)>

公式サイトには

dataclass を継承する場合、 __repr__() は継承するクラス名を省略します。

と記載してあって、どうやら`CreatureDataMixin`クラスを省いていると言う形になっていそう。

おわり

やっていることはなんとなくわかりました。

これ使って結構面白い書き方でクラス設計できそうだなと思ったので覚えておきます。