向每个oth引用Enum成员

2024-04-27 20:27:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

为什么会这样?你知道吗


Tags: selfnonebase定义defunitenumsymbol
2条回答

Python定义类的方式包括创建一个新的作用域,处理一堆语句(变量赋值、函数定义等),然后根据所有这些语句运行后存在的局部变量实际创建一个class对象。在最后一步之前,没有任何东西会转换成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尽管我上面使用的make_class函数实际上并不存在于该名称下,但它与Python真正做的没有太大区别,Python调用type的构造函数或元类(在本例中是Enum的元类)。你知道吗

达维兹很好地解释了这个问题。你知道吗

解决此问题所需的最后一点是:当运行每个成员的__init__时,已经创建了Enum,因此可以调用它:

self.base_unit = self if base_unit is None else self.__class__(base_unit)

相关问题 更多 >