首页 > 解决方案 > 枚举中实现的哪一部分塑造了“isinstance”的行为?

问题描述

isinstance(x, E),当应用于 Enum 的子类E时,检查第一个参数是否x是 的成员e。例如,使用以下定义:

from enum import Enum

class E(Enum):
    X = 1
    Y = 2
    Z = 3

isinstance(E.X, E)返回True,但isinstance(1, E)返回False。我很困惑Enum实现如何使这项工作:我什至没有看到__instancecheck__被覆盖。Enum 实现如何使isinstance调用以这种方式工作?

标签: pythonenums

解决方案


在运行时没有什么特别需要处理的isinstance。枚举的特殊行为都是在您从Enum.

例如。

>>> from enum import Enum
>>> class E(Enum):
...     X = 1
...     Y = 2
... 
>>> 
>>> type(E.X)
<enum 'E'>
>>> E.X == 1
False

EnumhasEnumMeta作为它的元类,特殊处理是在EnumMeta.__new__其中构建E枚举类。除其他外,它的作用是将您定义为整数的所有属性替换为E具有给定值的实例。


推荐阅读