追いきれていないので回答ではありません。
なので、知識のある方の詳しい回答を待ちたいのですが、ちょっと調べたことを書いてみます。参考になれば。
まず、提示のクラスはenum.Enum単独の子クラスではなく、strクラスとの二重継承です。
Enum単独であれば、違いは発生しません。
python
1class CHAIR(enum.Enum):
2 shop = "shop"
3
4print(CHAIR.shop)
5print(f"{CHAIR.shop}")
6
7#CHAIR.shop
8#CHAIR.shop
そもそも、Enumは表示すると クラス名が付くようになっているのです。
さて、二重継承にすると違いが発生する理由ですが、まず、メソッドの解決順序を見てみるとこのようになっていて、
python
1print(TABLE.__mro__)
2
3# (<enum 'TABLE'>, <class 'str'>, <enum 'Enum'>, <class 'object'>)
strクラスのメソッドの方を先に探すようになっています。
printで直接していしたときと、f文字列の引数になったときで呼び出される特殊メソッド(__str__
など)が異なり、また、strクラスとEnumクラスで実装している特殊メソッドが異なれば、このような状況になると思います。
(※この先、どの特殊メソッドがどのように呼ばれて質問の状況になっているのかまで調べられませんでした)
試しに、以下の用に__str__
メソッドを定義してみたのですが、
python
1import enum
2
3class TABLE(str, enum.Enum):
4 shop = "shop"
5 def __str__(self):
6 return 'X'
7
8class DESK(str):
9 shop = "shop"
10
11class CHAIR(enum.Enum):
12 shop = "shop"
13
14
15print(TABLE.shop)
16print(f"{TABLE.shop}")
17print('{}'.format(TABLE.shop))
18print("a" + TABLE.shop)
19# X
20# X
21# X
22# ashop
不思議な結果になっています。 これで、f文字列のときに元の値だったらよかったのですが。