当前位置:  开发笔记 > 编程语言 > 正文

Python中枚举的常见做法是什么?

如何解决《Python中枚举的常见做法是什么?》经验,为你挑选了4个好方法。

我已多次看到这种模式:

>>> class Enumeration(object):
        def __init__(self, names):  # or *names, with no .split()
            for number, name in enumerate(names.split()):
                setattr(self, name, number)

>>> foo = Enumeration("bar baz quux")
>>> foo.quux
2

您也可以使用班级成员,但您必须提供自己的编号:

>>> class Foo(object):
        bar  = 0
        baz  = 1
        quux = 2

>>> Foo.quux
2

如果您正在寻找更健壮的东西(稀疏值,枚举特殊异常等),请尝试此配方.



1> Van Gale..:
class Materials:
    Shaded, Shiny, Transparent, Matte = range(4)

>>> print Materials.Matte
3


有点晚了,但你也可以做`Shaded,Shiny,Transparent,Matte = range(1,5)``如果你不喜欢`_unused`那里
我以前没见过那个好东西.
@Joan你可以做`_unused,Shaded,Shiny,Transparent,Matte = range(5)`
不幸的是,这种制作枚举的方法是不完整的,因为枚举不能被迭代,每个值也不是唯一的类型(例如只是一个int).
这应该更新,以添加"enums"在3.4版本的Python中
您也不必使用范围,单独为每个类变量分配值.

2> Ben Blank..:

我已多次看到这种模式:

>>> class Enumeration(object):
        def __init__(self, names):  # or *names, with no .split()
            for number, name in enumerate(names.split()):
                setattr(self, name, number)

>>> foo = Enumeration("bar baz quux")
>>> foo.quux
2

您也可以使用班级成员,但您必须提供自己的编号:

>>> class Foo(object):
        bar  = 0
        baz  = 1
        quux = 2

>>> Foo.quux
2

如果您正在寻找更健壮的东西(稀疏值,枚举特殊异常等),请尝试此配方.



3> Spell..:

我不知道为什么Enums不支持Python本地支持.我发现模仿它们的最好方法是重写_ str _和_ eq _,这样你就可以比较它们,当你使用print()时,你得到的是字符串而不是数值.

class enumSeason():
    Spring = 0
    Summer = 1
    Fall = 2
    Winter = 3
    def __init__(self, Type):
        self.value = Type
    def __str__(self):
        if self.value == enumSeason.Spring:
            return 'Spring'
        if self.value == enumSeason.Summer:
            return 'Summer'
        if self.value == enumSeason.Fall:
            return 'Fall'
        if self.value == enumSeason.Winter:
            return 'Winter'
    def __eq__(self,y):
       return self.value==y.value

用法:

>>> s = enumSeason(enumSeason.Spring)

>>> print(s)

Spring


PEP354有拒绝通知.见http://www.python.org/dev/peps/pep-0354/#rejection-notice
有一个类字典{"Spring":0,"Summer":1,...}会更快,并使用__init__来遍历条目和设置属性,因为那时__str__只能查看值而不是编码每个案例都可以手工制作.
请看:https://www.python.org/dev/peps/pep-0435/

4> Trey Stout..:

你可以使用继承结构,虽然我玩的越多,我感觉越脏.

class AnimalEnum:
  @classmethod
  def verify(cls, other):
    return issubclass(other.__class__, cls)


class Dog(AnimalEnum):
  pass

def do_something(thing_that_should_be_an_enum):
  if not AnimalEnum.verify(thing_that_should_be_an_enum):
    raise OhGodWhy

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有