首页 > 解决方案 > Python 中带有函数和构造函数的枚举

问题描述

我正在学习 Python,并且正在为 PyGame 库划定界限。没有错,我只是想让方法和类更适合我的特定项目。简而言之,我想做一个颜色枚举,但是枚举中的每个值都有一个RGB和Hex版本。因为我以前在 Java 中做过这个,所以我将大致说明我在 Java 枚举中的意思。

public enum Color {

    RED(new double[]{255, 0, 0}, "#ff0000"),
    CYAN(new double[]{0, 255, 255}, "#00e1ff");
    // Other colors...

    double[] rgb;
    String hex;

    Color(double[] rgb, String hex) {
        this.rgb = rgb;
        this.hex = hex;
    }

    public double[] getRGB() {
        return rgb;
    }

    public String getHex() {
        return hex;
    }
}

我在这里所做的只是为枚举创建一个构造函数(Java 中默认为私有),并使枚举中的每个项目都指定该构造函数中的参数。例如RED,通过构造函数指定rgb双精度数组等于{255,0,0},十六进制字符串为“ff0000”。使用底部的方法,您可以在代码中的任何位置检索这些值。

最后,如果我将枚举导入代码,然后使用 RED 项,我可以说 RED.getRGB() 并获得一个双精度数组。我想在这个枚举中添加一堆颜色,但我也想知道一般的语法,因为它适用于我程序的其他部分。

我想在 Python 中做到这一点。我几乎不了解在 Python 中制作常规枚举,也不了解整个“class Clazz(Enum):”的内容,但我当然不知道如何在 Python 中执行上述代码。我只是不知道语法。

标签: javapythonenumsclass-constructors

解决方案


不要想太多

class Color:
     def __init__(self,r,g,b):
        self.r = r
        self.g = g
        self.b = b

     def __str__(self):
         # return the string repr
         return f"#{self.r:02X}{self.g:02X}{self.b:02X}"

     def __getitem__(self,item):
         # allow `color[0],color[1],color[2]` access
         return [self.r,self.g,self.b][item]

     def __iter__(self):
         # cast to list
         return iter([self.r,self.g,self.b])

class Colors:
  RED = Color(255,0,0)
  GREEN = Color(0,255,0)
  BLUE = Color(0,0,255)
  WHITE = Color(255,255,255)
  BLACK = Color(0,0,0)

print(list(Colors.RED))
print(Colors.GREEN[1])
print("%s"%Colors.BLUE)

如果你真的想使用那个枚举类,你可以如下

从枚举导入枚举

class Color:
     def __init__(self,r,g,b):
        self.r = r
        self.g = g
        self.b = b

     def toHex(self):
         return f"#{self.r:02X}{self.g:02X}{self.b:02X}"

     def toRGB(self):
         return (self.r,self.g,self.b)

class Colors(Enum):
  RED = Color(255,0,0)
  GREEN = Color(0,255,0)
  BLUE = Color(0,0,255)
  WHITE = Color(255,255,255)
  BLACK = Color(0,0,0)

print(Colors.RED)
print(Colors.GREEN.value.toRGB())
print("%s"%Colors.BLUE.value.toHex())

推荐阅读