python - 相互引用 Enum 成员

标签 python python-3.x

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

相关文章:

python - 对 PyQt 应用程序进行单元测试

python - 如何在Python3.7中使用pydensecrf?

python - 如何在python中将 "key"列与其他列分别写入csv

Python venv 和 virtualenvwrapper 结合

python - 如何删除控制台中输入的问题?

python - 在 numpy block 上并行运行重循环

python - 根据路径编辑 XML 文件文本

python - 为什么调用 Python 的 'magic method' 不像对应的运算符那样进行类型转换?

python - QuerySEt 中的日期字段到字符串格式

python - 通过python从名称列表中提取最后两个字母