Python3.11引入了
实际上,
如果我创建一个
无论是
那么,
StrEnum
和IntEnum
,它们分别继承自str
或int
,并且还继承了ReprEnum
,后者又继承了Enum
。实际上,
ReprEnum
的实现是空的。>>> print(inspect.getsource(ReprEnum))
class ReprEnum(Enum):
"""
Only changes the repr(), leaving str() and format() to the mixed-in type.
"""
如果我创建一个
StrEnum
并检查MRO,我可以看到str
排在第一位。class Strings(StrEnum):
A = "a"
>>> Strings.__mro__
(<enum 'Strings'>, <enum 'StrEnum'>, <class 'str'>, <enum 'ReprEnum'>, <enum 'Enum'>, <class 'object'>)
无论是
str
还是Enum
都定义了__str__
和__repr__
。>>> str.__repr__
<slot wrapper '__repr__' of 'str' objects>
>>> str.__str__
<slot wrapper '__str__' of 'str' objects>
>>> Enum.__repr__
<function Enum.__repr__ at 0x7ffff69f72e0>
>>> Enum.__str__
<function Enum.__str__ at 0x7ffff69f7380>
那么,
__repr__
是如何从 Enum
继承而来的,而 __str__
又是如何从 str
继承而来的呢?