gpt4 book ai didi

python - 相互引用 Enum 成员

转载 作者:太空狗 更新时间:2023-10-30 00:04:41 26 4
gpt4 key购买 nike

我在 Python 中定义了以下枚举:

class Unit(Enum):
GRAM = ("g")
KILOGRAM = ("kg", GRAM, 1000.0)

def __init__(self, symbol, base_unit = None, multiplier = 1.0):
self.symbol = symbol
self.multiplier = multiplier
self.base_unit = self if base_unit is None else base_unit

我希望如此

print(Unit.GRAM.base_unit)
print(Unit.KILOGRAM.base_unit)

会回来

Unit.GRAM
Unit.GRAM

但是,我得到的结果很困惑

Unit.GRAM
g

为什么会这样?

最佳答案

Python 定义类的方式包括创建一个新的作用域、处理一堆语句(变量赋值、函数定义等),然后然后根据局部变量实际创建一个类对象在所有这些语句运行之后存在。在最后一步之前,什么都不会转换为 Enum 实例。

你可以这样理解:

def make_class_Unit():
GRAM = ("g")
KILOGRAM = ("kg", GRAM, 1000.0)

def __init__(self, symbol, base_unit = None, multiplier = 1.0):
self.symbol = symbol
self.multiplier = multiplier
self.base_unit = self if base_unit is None else base_unit
return make_class(name='Unit', base=Enum, contents=locals())

Unit = make_class_Unit()

这样看,希望您能在定义KILOGRAM 时分辨出GRAM 实际上只是一个字符串。直到最后一个阶段它才变成一个 Unit 实例,在这个阶段我调用了(虚构的)make_class() 函数。1


1尽管我在上面使用的make_class 函数实际上并不存在于该名称下,但它与 Python 真正做的并没有太大区别,即调用构造函数type 或元类(在本例中是 Enum 的元类)。

关于python - 相互引用 Enum 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52798221/

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