【问题标题】:Can I subclass an Enum in which I have defined a __new__ method?我可以将定义了 __new__ 方法的 Enum 子类化吗?
【发布时间】:2020-09-01 02:41:15
【问题描述】:

我想创建一个伪抽象(无需使用 ABC 的麻烦)枚举类,并将其子类化到不同的类中。我所有的子类都将使用相同的__new__ 方法,所以我想在超类中定义它。这样做,我在定义子类时遇到了AttributeError: 'NoneType' object has no attribute '_value_'

我的尝试:

from enum import Enum
class BasePattern(Enum):
    def __new__(cls, pattern, groups):
        obj = object.__new__(cls)
        obj._value_ = pattern
        obj.groups = groups
class ExamplePattern(BasePattern):
    example1 = (r"regex", ["group1"])

有没有一种简单的方法可以让它工作,或者最好在每个子类中定义公共__new__?如果担心的话,我使用 Python3.7.7。

【问题讨论】:

  • 请问您要解决什么问题?这感觉像是一个 XY 问题,并且似乎创造了更多的问题而不是解决原来的问题
  • __new__() 必须返回一些东西,这将成为实例的值。你在这里创建Nones。
  • @jasonharper:那是我的问题,很明显我错过了......如果你想把你的评论变成答案,我会接受。
  • @DeepSpace 我正在重构一些用于解析不同类型法律文本的代码。最终目标是扩展它(在其范围内添加新类型的文本)。每种类型的文本当前都由一个特定的枚举处理,并且它们看起来都很相似。这就是我尝试使用超类的原因。

标签: python python-3.x enums


【解决方案1】:

任何时候你使用__new__你必须返回一个对象——否则None被返回(这是Python中任何函数/方法的默认值)。

就您自己的Enum 基类的子类化而言——只要该基类中没有任何成员就可以了——根据需要设置尽可能多的默认行为。

旁注:在您的 ExamplePattern 类中,您不需要括号外集;括号是一个分组运算符,只有在有歧义时才需要创建元组——逗号,是元组的组成部分:

>>> a = 1, 2
>>> type(a)
<class 'tuple'>

>>> b = (5 )  # no comma
>>> type(b)
<class 'int'>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多