蟒蛇Enum的好印刷品

Dro*_*ror 4 python enums metaclass

假设我有以下内容:

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
Run Code Online (Sandbox Code Playgroud)

作为输出print(Color),我想看到:

The colors are:
- RED
- GREEN
- BLUE
Run Code Online (Sandbox Code Playgroud)

我试过了:

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

    @classmethod
    def __str__(self):
        res = "The colors are:\n"
        for g in set(map(lambda c: c.name, Color)):
            res += '- ' + g + '\n'
        return res
Run Code Online (Sandbox Code Playgroud)

但它只能起作用print(Color(1)).使用时如何使其正常工作print(Color)

wim*_*wim 7

要覆盖类的打印,可以__str__元类上定义:

from enum import Enum, EnumMeta

class MyEnumMeta(EnumMeta):
    def __str__(cls):
        lines = [f"The {cls.__name__.lower()}s are:"]
        for member in cls:
            lines.append(f"- {member.name}")
        return '\n'.join(lines)

class Color(Enum, metaclass=MyEnumMeta):
    RED = 1
    GREEN = 2
    BLUE = 3
Run Code Online (Sandbox Code Playgroud)

演示:

>>> Color
<enum 'Color'>
>>> print(Color)
The colors are:
- RED
- GREEN
- BLUE
>>> Color.RED
<Color.RED: 1>
>>> print(Color.RED)
Color.RED
Run Code Online (Sandbox Code Playgroud)

发现类名:

>>> class Animal(Enum, metaclass=MyEnumMeta): 
...     cat = 'meow' 
...     dog = 'woof' 
...     badger = 'grrr' 
...
>>> print(Animal)
The animals are:
- cat
- dog
- badger
Run Code Online (Sandbox Code Playgroud)