繁体   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