我在 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/