0

PythonでEnumクラスを作成したいと思います。次のような get_str() メソッドも必要です。

class Operation (object):
    START = 0
    STOP = 1
    (...)

    def get_str(self):
        operation_dispatcher = {
             Operation.START: "start", 
             Operation.STOP: "stop",
             (...)

             }
    return operation_dispatcher[self]

しかし、残念ながらその方法はうまくいきません。オブジェクトはintで、「int」オブジェクトには属性「get_str」がないというエラーメッセージが表示されました...その機能を実装する方法を知っていますか?

私は次のようなことをしようとしました:

Operation.get_str(operation_reference)およびoperation_reference.get_str()

アップデート:

class EnumMeta(type):
    def __getattribute__(self, name):
        return self(super(EnumMeta, self).__getattribute__(name))

class Enum(object):
    __metaclass__ = EnumMeta

    def __init__(self, value):
        super(Enum, self).__init__()

        self.value = value[0]
        self.repr = value[1]

    def __eq__(self, other):
        if isinstance(other, Enum):
            return self.value == other.value
        elif isinstance(other, int):
            return self.value == other
        else:
            return object.__eq__(Enum, other)

    def __repr__(self):
        return str(self.repr)

class Operation(Enum):
    START = (0, "start")
    STOP = (1, "stop")
    (...)

operation_dispatcher = {
             Operation.START: start_method, 
             Operation.STOP: stop_method,
             (...) }

# invoking
operation_dispatcher[Operation.START.value]()
4

2 に答える 2

0

クライアント コードを最小限に抑えるために、メタクラスを使用して目標を達成することをお勧めします。まず、以下のメタクラスをチェックアウトします。

class EnumMeta(type):
    def __getattribute__(self, name):
        actual_value = super(EnumMeta, self).__getattribute__(name)
        if isinstance(actual_value, self):
            return actual_value
        else:
            new_value = self(actual_value)
            super(EnumMeta, self).__setattr__(name, new_value)
            return new_value

これは単純に をオーバーライド__getattribute__し、属性値をコンストラクター引数として使用して子クラスのインスタンスを返します。また、毎回新しいインスタンスを作成しないように元の値を更新し、さらにオブジェクトの参照を使用して等価チェックを行います。

次に、次のEnumようにクラスを定義します。

class Enum(object):
    __metaclass__ = EnumMeta

    def __init__(self, value):
        super(Enum, self).__init__()

        self.value = value[0]
        self.repr = value[1]

    def __repr__(self):
        return str(self.repr)

==この基本クラスは、int 値を使用して比較するequals ( ) 演算子と__repr__、列挙型の文字列表現を返すメソッドを実装しています。だからここに行く:

class Operation(Enum):
    START = (0, "start")
    STOP = (1, "stop")

>>> Operation.START == Operation.START
True
>>> Operation.START is Operation.START
True
>>> Operation.START == Operation.STOP
False
>>> Operation.START
"start"
>>> repr(Operation.STOP)
"stop"
于 2015-08-03T07:52:34.223 に答える