Перечисления с функциями и конструкторами в Python - PullRequest
0 голосов
/ 17 марта 2020

Я изучаю Python и делаю границы для библиотеки PyGame. В этом нет ничего плохого, я просто хочу сделать методы и классы более подходящими для моего проекта c. Короче говоря, я хочу сделать перечисление цветов, но каждое значение в перечислении имеет версии 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;
    }
}

Все, что я делаю здесь, это создание конструктора (по умолчанию private) в Java) для перечисления и создания каждого элемента в перечислении укажите параметры в этом конструкторе. RED, например, указывает, что двойной массив rgb через конструктор равен {255, 0, 0}, а шестнадцатеричная строка - "ff0000". С помощью методов внизу вы можете получить эти значения в любом месте кода.

В конце концов, если я импортирую перечисление в код, а затем использую элемент RED, я могу сказать RED.getRGB ( ) и получить двойной массив. Я хочу добавить несколько цветов в это перечисление, но я также хочу знать синтаксис для этого в целом, потому что он применяется к другим частям моей программы.

Я хочу сделать это в Python. Я с трудом понимаю, как создавать регулярные перечисления в Python, и не понимаю всего, что касается класса Clazz (Enum): но я, конечно, не знаю, как сделать код, приведенный выше в Python. Я просто не знаю синтаксис.

1 Ответ

1 голос
/ 17 марта 2020

не переусердствуйте

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)

Если вы действительно хотите использовать этот класс enum, вы можете сделать следующее:

из enum import Enum

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())
...