어떻게 최고의 에뮬레이션 및/또는 피 enum 의에서는 파이썬?[중복]

StackOverflow https://stackoverflow.com/questions/108523

  •  01-07-2019
  •  | 
  •  

문제

이 질문은 이미 있는 대답을 여기:

내가 사용했던 작은 클래스를 겨루에서 열거형을 일부 프로젝트 파이썬.더 좋은 방법이 있거나는 이들에게 대부분의 감각한 상황?

클래스 코드는 여기:

class Enum(object):
'''Simple Enum Class
Example Usage:
>>> codes = Enum('FOO BAR BAZ') # codes.BAZ will be 2 and so on ...'''
def __init__(self, names):
    for number, name in enumerate(names.split()):
        setattr(self, name, number)
도움이 되었습니까?

해결책

의 많은 좋은 토론 .

다른 팁

열거되었다 제안에 포함시키기 위해 언어가기 전에,그러나 거부되었다(참조 http://www.python.org/dev/peps/pep-0354/),가 있지만 기존의 패키지를 사용할 수 있습 쓰는 대신에 자신의 구현:

가장 일반적인 경우 열거는 열거된 값의 일부 상태나 전략을 디자인 패턴입니다.에 열거형은 특정국 또는 특정 선택적 전략을 사용할 수 있습니다.이 경우에,그들은 거의 항상 부분의 일부는 클래스 정의

class DoTheNeedful( object ):
    ONE_CHOICE = 1
    ANOTHER_CHOICE = 2 
    YET_ANOTHER = 99
    def __init__( self, aSelection ):
        assert aSelection in ( self.ONE_CHOICE, self.ANOTHER_CHOICE, self.YET_ANOTHER )
        self.selection= aSelection

그런 다음에 클라이언트의 이 클래스입니다.

dtn = DoTheNeeful( DoTheNeeful.ONE_CHOICE )

무엇을 보고 더 자주 이것은,최상위 모듈 context:

FOO_BAR = 'FOO_BAR'
FOO_BAZ = 'FOO_BAZ'
FOO_QUX = 'FOO_QUX'

...그리고 나중에...

if something is FOO_BAR: pass # do something here
elif something is FOO_BAZ: pass # do something else
elif something is FOO_QUX: pass # do something else
else: raise Exception('Invalid value for something')

주의 사용 is== 은 위험을 여기에서-그것은에서는 사람들이 사용하는 your_module.FOO_BAR 가 아닌 문자열 'FOO_BAR' (는 것입니다 일반적으로 수감되는 is 일치합니다,그러나 확실히 될 수 없습니에 계산),그리고 그렇게 적절하지 않을 수 있습 상황에 따라.

의 장점 중 하나 그것은 이 방법으로 보면 어디서든 대한 참조는 문자열이 저장되는,그것은 즉시 그것이 어디에서 왔; FOO_BAZ 다 훨씬 적은 모호한다 2.

그 외에,다른 것은 나쁘다 내 Pythonic 감각을 다시 클래스는 당신이 제안의 사용 split().왜 그냥 통과하는 tuple,목록 또는 기타 열거을 시작으로?

내장 방식을 사용하여 열거입니다:

(FOO, BAR, BAZ) = range(3)

진을 위해 작은,하지만 몇 가지 단점이 있다:

  • 필요할 수를 계산하는 요소에 의해 손으로
  • 할 수 없습니다 건너뛰기 값
  • 를 추가하는 경우 하나의 이름을,당신은 또한 업데이트할 필요가 범위의 번호

에 대한 완전한 enum 구현 라이브러리는 모두 지원되며,참조하십시오:http://code.activestate.com/recipes/67107/

기 시작했으로 보이는 것 같은 로트의 대답 하지만 나는 과부'str'과'eq'(신의 전체 개체 클래스)그래서 나는 인쇄할 수 있었고 비교 enum 의 값입니다.

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

인쇄(x)얻을 것입니다 당신의 가치와 두 값을 들고 봄이 될 것 같습니다.

   >>> x = enumSeason(enumSeason.Spring)
   >>> print(x)
   Spring
   >>> y = enumSeason(enumSeason.Spring)
   >>> x == y
   True
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top