使用枚举作为类中的标志,Python

BiA*_*BiA 9 python oop class python-3.4

我想使用枚举来表示类的内部状态:

#!/usr/bin/python3
from enum import Enum


class testClass:
    class Color(Enum):
        red = 1
        blue = 2
        green = 3

    def __init__(self):
        self.value = 0

    def setValue(self, Color):
        self.value = Color
Run Code Online (Sandbox Code Playgroud)

这就是我认为可能的实施方案。我看到的两件烦人的事情是:

  1. 要设置value我必须做:

    q = testClass()

    q.setValue(q.Color.red)

    我觉得这q.Color.red有点令人不快,我宁愿有类似的东西:Color.red或者只是red。也许唯一的方法是使用一些字符串比较,但这正是我试图避免使用枚举的。

  2. 我得到了一个额外的方法,q.Color.mro它看起来像是枚举类的内部方法。这个是来做什么的?

Rob*_*obᵩ 10

替代方案#1:您可以让该类Enum为您进行字符串查找:

    def setValue(self, color):
        self.value = self.Color[color]
Run Code Online (Sandbox Code Playgroud)

用法:

q = testClass()
q.setValue('red')
Run Code Online (Sandbox Code Playgroud)

参考:


替代方案#2:如果没有冲突,您可以将 Enum 的成员提升到父类:

class testClass:
    class Color(Enum):
        red = 1
        blue = 2
        green = 3
    red = Color.red
    blue = Color.blue
    green = Color.green

    def setValue(self, color):
        self.value = color
Run Code Online (Sandbox Code Playgroud)

用法:

q = testClass()
q.setValue(q.red)
Run Code Online (Sandbox Code Playgroud)

  • `red`/`blue`/`green` 赋值可以替换为 `locals().update(Color.__members__)` (3认同)