如何使用 Enum.__members__ 无法访问的私有枚举值?

How to use private enum values that are not accessible by Enum.__members__?

像这样的 Enum 对象:

from enum import Enum

class Fruits(str, Enum):
    apple = "apple"
    banana = "banana"
    orange = "orange"
    lemon = "lemon"

    _citrus = {orange, lemon}

    def is_citrus(self):
        return self in self.citrus

当我们尝试检查其成员时:

>>> Fruits.__members__.keys()
dict_keys(['apple', 'banana', 'orange', 'lemon', '_citrus'])

我们得到了所有可能的枚举值。有没有一种方法可以声明私有与 public 枚举,其中某些特定值是私有的并且 Enum.__members__ 无法访问?

可以这样做:

from enum import Enum

class Fruits(str, Enum):
    apple = "apple"
    banana = "banana"
    orange = "orange"
    lemon = "lemon"

    _citrus = {orange, lemon}

    def is_citrus(self):
        return self in self.citrus
    
    @classmethod
    def values(cls):
        return set(k for k in cls.__members__.keys() if not k.startswith('_'))

用法:

>>> Fruits.values()
{'apple', 'banana', 'lemon', 'orange'}

是否有其他方法可以限制成员访问?

Python 的枚举中是否有私有成员与 public 成员的示例?

你可以使用 property 来解决这个问题,像这样:

class Fruits(str, Enum):
    apple = "apple"
    banana = "banana"
    orange = "orange"
    lemon = "lemon"

    @property
    def _citrus(self):
        return {self.__class__.orange, self.__class__.lemon}

    def is_citrus(self):
        return self in self._citrus
    

print(Fruits.orange.is_citrus())
# True

print(Fruits.__members__.keys())
dict_keys(['apple', 'banana', 'orange', 'lemon'])