Mixin Enums 并检查 Enum 对象是否是该类的子集之一

alv*_*vas 0 python enums class class-method

我有一个 mixin str+Enum 类,它允许我的代码的其他部分访问我的变量状态的字符串表示。

有一个特定的 Enumcitrus类型可以来自所有可能枚举的子集。目前我正在使用 aclassmethod来检查“柑橘性”,例如:

from enum import Enum

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

    citrus = {orange, lemon}

    @classmethod
    def is_citrus(cls, state):
        return state in cls.citrus
Run Code Online (Sandbox Code Playgroud)

[用法]:

>>> o = Fruits.orange
>>> Fruits.is_citrus(o)
True
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 那里的类​​方法合适吗?
  • 有没有更好的方法来改善“柑橘性”的检查方式?
  • 目前,我将不得不使用这些Fruits.is_citrus方法来检查oEnum 对象,如何Fruit更改该类以便我可以执行类似的操作o.is_citrus()

Sam*_*ord 5

使它成为一个普通的实例方法:

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

    citrus = {orange, lemon}

    def is_citrus(self):
        return self in self.citrus
Run Code Online (Sandbox Code Playgroud)

我并不肯定citrus = {orange, lemon}它完全按照你的想法去做(它最终是一个集合的字符串表示而不是一个实际的集合)——而不是citrus它自己的枚举值,我会实现“柑橘”的概念—— ness”仅在 内is_citrus,像这样:

    def is_citrus(self):
        return self in {Fruits.orange, Fruits.lemon}
Run Code Online (Sandbox Code Playgroud)

  • 呃这就是为什么字符串枚举打败了整点。向后兼容是可以理解的,但就是这样 (2认同)