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)?
要覆盖类的打印,可以__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)
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |