【问题标题】:How to add a method to an enum?如何向枚举添加方法?
【发布时间】:2017-05-23 16:18:13
【问题描述】:

我想在我的枚举中添加一个方法。

class Kerneltype(Enum):
    tube = 0
    subspace_KDE = 1
    deltashift = 2
    dist_sens_via_mass_1 = 3

    def aslist(self):
        return [self.tube, self.subspace_KDE, self.deltashift, self.dist_sens_via_mass_1]

    def fromint(self, int):
        return self.aslist()[int]

不起作用。而不是

Kerneltype.aslist()

我现在必须做

[kt[1] for kt in ob.Kerneltype.__members__.items()]

【问题讨论】:

  • “不起作用”是一个非常模糊的问题描述。请更具体一些,并向我们提供您收到的任何错误消息。
  • 注意,你的aslist 方法不会做任何list(Kerneltype) 不会自动给你的事情。
  • 这里的文档很有帮助;您不需要iterate over your enum 的方法,您可以通过calling it like a function 的整数索引访问它。
  • @Ben 函数调用实际上需要一个值而不是索引。
  • @Ben 这行得通,因为 Enum 中的项目也类似于索引,请将 subspace_KDE 更改为 5,然后重试。

标签: python enums


【解决方案1】:

您创建了一个实例方法,因此 aslist 仅存在于 Kerneltype 的实例上(即枚举成员本身)。你需要a classmethod

@classmethod
def aslist(cls):
    return [cls.tube, cls.subspace_KDE, cls.deltashift, cls.dist_sens_via_mass_1]
>>> Kerneltype.aslist()
[<Kerneltype.tube: 0>, <Kerneltype.subspace_KDE: 1>, <Kerneltype.deltashift: 2>, <Kerneltype.dist_sens_via_mass_1: 3>]

【讨论】:

  • 为什么是@classmethod 而不是@staticmethod?
  • @zzz777 见this question for the difference。静态方法无法访问类类型,因此也无法访问其类属性。
  • 抱歉,无法从讨论中解读出太多信息。我只使用类,因为我想访问/操作封装在一个类中的数据(我过去是用 C++ 编写的)。讨论集中在以各种方式打印类名。类和类变量中有静态变量,唯一的大区别是类变量/方法可以被派生类修改吗?如果你能有所启发,那就太好了。
  • @zzz777 Python 没有其他语言意义上的“静态变量”。 OP 示例中的成员,例如tubedeltashiftclass variables,它们存储在类/类型而不是实例上。如果你想访问这些,你需要有一个类型的引用。该引用是传递给@classmethod 方法但不是@staticmethod 方法的cls
  • 抱歉,我现在在 python3 的类中使用静态变量,这似乎是一种误解,它似乎运行良好。再次抱歉,我会尝试以不同的方式提出我的问题。
【解决方案2】:

您应该使用 classmethod 装饰器定义您的方法,因为您是从类而不是 Enum 成员中调用它们。

@classmethod
def aslist(cls):
    return [cls.tube, cls.subspace_KDE, cls.deltashift, cls.dist_sens_via_mass_1]

@classmethod
def fromint(cls, int):
    return cls.aslist()[int]

正如其他人在cmets中提到的那样,您的aslist()方法不是必需的,您可以直接使用list() on it,它默认保留定义的顺序。唯一的区别是它不返回别名。

>>> list(Kerneltype)
[<Kerneltype.tube: 0>, <Kerneltype.subspace_KDE: 1>, <Kerneltype.deltashift: 2>, <Kerneltype.dist_sens_via_mass_1: 3>]

【讨论】:

  • 每个成员都是 Enum 类的一个实例,实例方法确实有意义(只是在这个例子中没有)。
  • 很公平,这里有一个例子:Python Enum, when and where to use?
  • @EthanFurman 谢谢,已更新我的答案以删除与实例化相关的位。
  • 我做了一些改写——希望你喜欢。 :)
【解决方案3】:

你错过了 classmethod 装饰器:

@classmethod
def aslist(self):
    return [self.tube, self.subspace_KDE, self.deltashift, self.dist_sens_via_mass_1]

【讨论】:

    【解决方案4】:

    您所做的问题是尝试通过 self 访问枚举值,而您应该像通常通过枚举一样访问它们。

    from enum import Enum
    
    class V(Enum):
        V1 = (1, 2)
        V2 = (2, 3)
        def getKey(v: float):
            return [k for k in list(V) if v > k.value[0] and v < k.value[1]]
    
    V.getKey(1.1) #  [<V.V1: (1, 2)>]
    V.getKey(1.1)[0].value # (1, 2) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2015-11-29
      • 2015-03-24
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2013-09-23
      相关资源
      最近更新 更多