官方的Enum How to有this example个:

class Planet(Enum):
    MERCURY = (3.303e+23, 2.4397e6)
    VENUS   = (4.869e+24, 6.0518e6)
    EARTH   = (5.976e+24, 6.37814e6)
    MARS    = (6.421e+23, 3.3972e6)
    JUPITER = (1.9e+27,   7.1492e7)
    SATURN  = (5.688e+26, 6.0268e7)
    URANUS  = (8.686e+25, 2.5559e7)
    NEPTUNE = (1.024e+26, 2.4746e7)

    def __init__(self, mass, radius):
        self.mass = mass       # in kilograms
        self.radius = radius   # in meters

    @property
    def surface_gravity(self):
        # universal gravitational constant  (m3 kg-1 s-2)
        G = 6.67300E-11
        return G * self.mass / (self.radius * self.radius)
>>> Planet.EARTH.value
(5.976e+24, 6378140.0)

>>> Planet.EARTH.surface_gravity
9.802652743337129

假设我正在做这样的事情,并且我想将.value-像(3.303e+23, 2.4397e6)这样的元组-作为PlanetAPI的不稳定实现细节来对待.我不想让我的API用户依赖它们.相反,我希望它们使用我显式公开的属性,如.surface_gravity.

有没有一种传统的方式来表示这一点?

我目前只是在文档字符串中添加如下注释:

class Planet(Enum):
    """.value is an implementation detail. Use .surface_gravity instead."""

但这似乎太容易忽视了.

如果是普通班,我会选._value人,而不是.value人.但在这里,.value是自动添加的,因为我是从Enum派生的子类,我看不到覆盖它的方法.

推荐答案

任何枚举的确切值几乎总是一个实现细节;公开它的原因是有时能够访问它是很有用的.

有几种方法可以淡化它的存在:

  • 更改该枚举类的repr()
    def __repr__(self):
        return '<%s.%s>' % (self.__class__.__name__, self._name_)
  • 有一个定制的__new__,使value显然是"错误的",被视为表面上的恩惠(或其他东西)(可能与上面的__repr__相结合):
    def __new__(cls, mass, radius):
        member = object.__new__(cls):
        member._value_ = len(cls._member_names_)
        member.mass = mass
        member.radius = radius
        return member
  • 您可以结合使用dataclass(它会自动更新REPR):
    @dataclass
    class PlanetData:
        mass: float
        radius: float

    class Planet(PlanetData, Enum):
        MERCURY = (3.303e+23, 2.4397e6)
        VENUS   = (4.869e+24, 6.0518e6)
        # etc

    >>> Planet.VENUS
    <Planet.VENUS: mass=4.869e+24, radius=6051800.0>

披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)图书馆的作者.

Python相关问答推荐

如何在超时的情况下同步运行Matplolib服务器端?该过程随机挂起

"Discord机器人中缺少所需的位置参数ctx

Pandas 在时间序列中设定频率

Odoo -无法比较使用@api.depends设置计算字段的日期

线性模型PanelOLS和statmodels OLS之间的区别

acme错误-Veritas错误:模块收件箱没有属性linear_util'

时间序列分解

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

使用groupby Pandas的一些操作

Python—从np.array中 Select 复杂的列子集

Pre—Commit MyPy无法禁用非错误消息

CommandeError:模块numba没有属性generated_jit''''

try 检索blob名称列表时出现错误填充错误""

提高算法效率的策略?

将一个双框爆炸到另一个双框的范围内

根据客户端是否正在传输响应来更改基于Flask的API的行为

如何过滤组s最大和最小行使用`transform`'

将CSS链接到HTML文件的问题

极点替换值大于组内另一个极点数据帧的最大值

如何在Django模板中显示串行化器错误