Hatena::ブログ(Diary)

しがないプログラマ の日記 RSSフィード Twitter

0000 | 00 |
2004 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 03 | 05 | 06 | 07 | 08 | 09 | 11 |
2012 | 01 | 02 | 04 | 06 | 07 | 08 | 09 | 11 |
2013 | 01 | 03 |

2009年10月17日(土)

PythonでEnumを書いてみた。

とても車輪の再発明な気もしますが、勉強意味の含めて自分で実装してみました。と、言っても大したものではないですけど。Enumと言っても C言語的なものではなく、JavaでのEnumを意識してます。

Enumクラスの実装はこんな感じ。

enum.py

# -*- coding: utf-8 -*-
class Enum(object):
    @classmethod
    def values(cls):
        if hasattr(cls, '_values'):
            return cls._values
        else:
            return [elm for elm in
                map(lambda x: getattr(cls, x), dir(cls))
                if type(elm) == cls]
    @classmethod
    def create(cls, names, values):
        cls._values = []
        for name, value in zip(names, values):
            inst = cls(*value)
            setattr(cls, name, inst)
            cls._values.append(inst)

Enum定義は、このクラス継承して以下のようなクラスを書きます。

sample_enum.py

# -*- coding: utf-8 -*-
from enum import Enum

class SampleEnum(Enum):
    def __init__(self, value):
        self.value = value

SampleEnum.create(
    (
        'A', 'B', 'C', 'D', 'E',
    ),
    (
        map(lambda i: [i], range(0, 5))
    )
)

使う時は、こんな感じで。

from sample_enum import SampleEnum

print SampleEnum.A
print SampleEnum.C.value

e = SampleEnum.B
if e == SampleEnum.E:
    print 'false'
elif e == SampleEnum.B:
    print 'true'

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Horiuchi_H/20091017/1255775555
PV: 754547