gpt4 book ai didi

python - 有没有办法直接从枚举实例化一个类?

转载 作者:太空狗 更新时间:2023-10-30 02:51:02 25 4
gpt4 key购买 nike

我最近发现您可以在 Python 中使用枚举,但我对我的代码的工作方式不满意,我想知道是否有更简洁的方法来实现它。

from enum import Enum

class Hex:
def __init__(self, hex_code: str):
self.code = hex_code

class Rgb:
def __init__(self, R: int, G: int, B: int):
self.r = R
self.g = G
self.b = B

class Color(Enum):
HEX = Hex
RGB = Rgb

def main():
hex_color = Color.HEX.value('#00FF00')
rgb_color = Color.RGB.value(255, 255, 255)

if __name__ == "__main__":
main()

在这个例子中,我必须通过调用 .value() 枚举方法来实例化。但是当你正常实例化一个类时,你所做的只是Class(value)。是否有可能实现类似于包含类的枚举变体的东西?例如:

Color.HEX('#00FF00')
# Instead of:
Color.HEX.value('#00FF00')

最佳答案

HEXRGB 不是类;它们是 Color实例。 (enum 使用了一个滥用 class 语句的元类。)您使用这些实例的 value 属性来获取您的值“分配给这些名字。

为了使 Color.HEX('#00ff00') 返回类 Hex 的实例,您需要定义 Color.__call__。 (顺便说一句,请注意,您可以简单地在定义 Colorclass 语句中定义这两个类,而不是在外部定义它们。一个 class 语句本质上只是一个花哨的赋值语句。)

from enum import Enum

class Color(Enum):
class HEX:
def __init__(self, hex_code: str):
self.code = hex_code

class RGB:
def __init__(self, R: int, G: int, B: int):
self.r = R
self.g = G
self.b = B

def __call__(self, *args):
return self.value(*args)

然后

>>> Color.HEX('#00ff00')
<__main__.Color.HEX object at 0x108740f28>

没有 __call__ 的继承值被覆盖,因此没有立即需要在其定义中使用任何类似 super().__call__(*args) 的东西。如果你认为你需要支持多重继承,那可能会改变,但考虑到 Enum 使用自定义元类,我将声明处理超出这个问题的范围。

关于python - 有没有办法直接从枚举实例化一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57171292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com