继承str与enum.Enum的类,两种打印方式为何输出结果不同?
继承str与enum.Enum的类,两种打印方式为何输出结果不同?
你给出的代码如下:
import enum class Status(str, enum.Enum): """Status options.""" NEW = "NEW" EXCLUDED = "EXCLUDED" print("" + Status.NEW) print(Status.NEW)
这事儿得从Python枚举类的特性和隐式类型转换两方面来说,我给你拆解开:
第一个场景:
print("" + Status.NEW)输出"NEW"
当你把枚举成员和空字符串做拼接时,Python的字符串+操作要求两边都是字符串类型,所以会自动触发隐式类型转换——把Status.NEW转换成字符串。
因为你的Status类继承了str,每个枚举成员(比如Status.NEW)同时是str的子类实例,转换后会直接返回它对应的字符串值"NEW",最终拼接结果就是"NEW",打印出来自然就是这个内容。第二个场景:
print(Status.NEW)输出"Status.NEW"
这里大概率是你混淆了两种输出场景:如果是在Python交互式环境里直接输入Status.NEW,会显示它的repr结果(类似<Status.NEW: 'NEW'>),你可能简化描述成了"Status.NEW";但如果是用print函数输出,正常情况下应该也是"NEW"才对。不过如果确实出现了
print(Status.NEW)输出"Status.NEW"的情况,可能是你用的Python版本太旧(比如Python 3.6及以前),这种混合继承的行为在旧版本里和现在不同;或者是你不小心写错了继承顺序(不过把enum.Enum放在str前面会报错,因为Enum要求作为第一个基类)。
核心逻辑总结:
- 字符串拼接时,枚举成员会因为继承了
str而被转换成对应的字符串值; - 直接打印枚举成员时,若继承了
str,默认会输出字符串值;若没继承str,才会输出类似Status.NEW的枚举标识。
备注:内容来源于stack exchange,提问作者NoMorePen
相关产品推荐
相关产品推荐

