簡體   English   中英

如何在 Python 中實現類似 Java 的枚舉?

[英]How do I implement a Java-like enumeration in Python?

說這個的python版本是什么..這是在java中

public static enum Operations {Add, Subtract, Multiply, Divide, None};

我正在將整個程序轉換為 python,我只是想不通這部分

這是我全班同學

    import java.util.*;

public class Expression
{
    public static enum Operations {Add, Subtract, Multiply, Divide, None};
    int a;
    int b;
    Expression.Operations op;
    public Expression()
    {
        a = 0;
        b = 0;
        op = Expression.Operations.None;
    }
    public Expression(int value1, int value2, Expression.Operations operation)
    {
        a = value1;
        b = value2;
        op = operation;
    }

    public boolean parseString(String expressionString, Map<Character, Integer> vars)
    {
        Scanner scanner = new Scanner(expressionString);

        //Attempt to read the first value.
        if (scanner.hasNextInt())
            a = scanner.nextInt();
        else if (scanner.hasNext())
        {
            String var = scanner.next();
            //Ensure that the variable identifier is a single alphabetical character in length.
            if (!var.matches("[A-Z]{1}"))
            {
                return false;
            }
            if (vars.containsKey(var.charAt(0)))
                a = vars.get(var.charAt(0));
            else
            {
                System.err.println("ERROR: Uninitialized variable.");
                return false;
            }
        }
        else return false;

        //If more tokens exist, attempt to read the operator.
        if (scanner.hasNext())
        {
            String operator = scanner.next();
            if (operator.equals("+"))
                op = Expression.Operations.Add;
            else if (operator.equals("-"))
                op = Expression.Operations.Subtract;
            else if (operator.equals("*"))
                op = Expression.Operations.Multiply;
            else if (operator.equals("/"))
                op = Expression.Operations.Divide;
            else
                return false;

            //Attempt to read the second value.
            if (scanner.hasNextInt())
                b = scanner.nextInt();
            else if (scanner.hasNext())
            {
                String var = scanner.next();
                //Ensure that the variable identifier is a single alphabetical character in length.
                if (!var.matches("[A-Z]{1}"))
                {
                    return false;
                }
                b = vars.get(var.charAt(0));
            }
            else return false;
        }

        return true;
    }
    public int evaluate()
    {
        int value = 0;
        if (op == Expression.Operations.Add)
            value = a + b;
        if (op == Expression.Operations.Subtract)
            value = a - b;
        if (op == Expression.Operations.Multiply)
            value = a * b;
        if (op == Expression.Operations.Divide)
            value = a / b;
        if (op == Expression.Operations.None)
            value = a;
        return value;
    }
}

你總是可以使用 NamedTuple

>>> import collections
>>> Enum = collections.namedtuple('Enum','Add Subtract Multiply Divide None_')
>>> Enum(*range(1,6))
Enum(Add=1, Subtract=2, Multiply=3, Divide=4, None_=5)
>>> operations = _
>>> operations.Add
1

在較新的 Python 版本上,您無法分配給None ,因此我將其更改為None_

Python 沒有枚舉類。 它只是使用普通整數來完成。 使模板成為類的一部分的最簡單方法是執行以下操作:

class Operation:
    ADD, SUBTRACT, MULTIPLY, DIVIDE, NONE = range(5)

這會將 add 賦值為 0,none 賦值為 4。這是最干凈的方法(並且它將保證您在此序列中沒有任何相同數字的枚舉,並且您沒有錯過分配某些東西到其中一個數字。

在 Python 中,任何屬性或方法都被認為是公共的,除非您在其名稱的開頭加上下划線。 這是 Python 2.7 教程中的相關部分

Python 沒有辦法完全復制static的功能,但是您在類上定義的任何屬性都將在實例中以與static變量相同的方式可見。 只需在您的類定義中添加attribute = value就可以了。

您不能在 Python 中使值constant ,但約定是使用UPPERCASE_IDENTIFIERS來表示該意圖。

枚舉不存在。 在 Python 中,普通字符串常量通常用於此目的。 只需將"add" "subtract" , "multiply" , "divide"None傳遞給您的函數。

例如,在您的解析器中

if (operator.equals("+"))
    op = Expression.Operations.Add;

會成為

if operator == "+":
    op = "add"

並在您的評估器中

if (op == Expression.Operations.Add)
    value = a + b;

會成為

if op == "add"
    value = a + b

dict 可以提供符號和函數之間的映射。 operator模塊提供對表達式中使用的內置函數的便捷訪問。 此外,您可以通過將某些屬性設置為只讀屬性來防止它們被錯誤代碼意外修改。 嘗試修改它們將在運行時引發 AttributeError。 如果有人真的需要寫訪問權限,它仍然可以通過下划線前綴變量獲得,但這是一個私有接口。

import operator

class Expression(object):

    _OP_MAP = dict((x, getattr(operator, y)) for x, y in 
        [('*', 'mul'), ('/', 'truediv'), ('//', 'floordiv'), 
         ('+', 'add'), ('-', 'sub')])

    _OP_MAP[None] = lambda a, b: a

    a = property(lambda self: self._a)   #read-only interface
    b = property(lambda self: self._b) 
    op = property(lambda self: self._op)

    def __init__(self, value1=0, value2=0, operation=None):
        self._a = value1                 #mutable -- we're all adults
        self._b = value2
        self._op = self._OP_MAP[operation]

    def parse_string(self, expression_string, variables): 
        #...
        self._op = self._OP_MAP.get(operator) #defaults to None

    def evaluate(self):
        return self.op(self.a, self.b)

    def __repr__(self): 
        for k, v in self._OP_MAP.items():
            if self.op == v:
                return '{0} {1} {2}'.format(self.a, k, self.b)

最好的方法是:

class Operations:
    Add=1
    Subtract=2
    Multiply=3
    Divide=4
    None=5

Java 中的枚舉依賴於http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern - Java 中的枚舉類似於:Enum>。 所以除非python支持那種東西,否則你可能不得不使用類似的東西
類型安全枚舉模式: http : //java.sun.com/developer/Books/effectivejava/Chapter5.pdf

Python 最新版本確實支持枚舉,只是想在閱讀上述所有響應后關閉循環

https://docs.python.org/3/library/enum.html

我喜歡枚舉,我希望 Python 有某種官方的枚舉。

這是我寫的關於 Python 枚舉的另一個答案的鏈接:

如何在 Python 中表示“枚舉”?

這是我在那里推薦的食譜的直接鏈接:

http://code.activestate.com/recipes/413486/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM