繁体   English   中英

python中枚举中的抽象方法

[英]abstract method in an enum in python

我的问题是,如何用python写这个? 这样的事情可能吗?

它应该如何工作:我从一个算法中获取数据,该算法将决定输出哪个字母。 如果数据中的某些条件不适用于一个字符,则应针对另一个字符检查这些条件。 数据和条件当然比这里显示的要复杂。

为什么要枚举:因为只有这个小的 main 方法必须写在算法文件中(可迭代)。 并且信件的条件被封装在另一个文件中并且结构清晰。

enum Letter {
    
    A () {
        public boolean condition(int[] args) {
            if (args[0] > args[1]) return false;
            if (args[1] > args[2]) return false;
            return true;
        }
    },
    
    B () {
        public boolean condition(int[] args) {
            if (args[0] > args[1]) return false;
            if (args[1] < args[2]) return false;
            return true;
        }
    },
    
    C () {
        public boolean condition(int[] args) {
            if (args[0] < args[1]) return false;
            if (args[1] < args[2]) return false;
            return true;
        }
    };
    
    public abstract boolean condition(int[] args);
    
}
public class Alphabet {
    
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        //int[] arr = {1, 2, 1};
        //int[] arr = {3, 2, 1};
        
        for (Letter l : Letter.values()) {
            if (l.condition(arr)) {
                System.out.println(l);
                break;
            }
        }
    }
}

虽然您可以硬塞一个 Enum 来实现此目的,但使用可以迭代的 dict 或函数列表会容易得多,例如:

letters = [
    ("A", lambda args: args[0] <= args[1] <= args[2]),
    ("B", lambda args: args[0] <= args[1] >= args[2]),
    ("C", lambda args: args[0] >= args[1] >= args[2]),
]

def alphabet(args):
    print(next(letter for letter, condition in letters if condition(args)))

alphabet([1, 2, 3])  # A
alphabet([1, 2, 1])  # B
alphabet([3, 2, 1])  # C

或者使用类型注释(这些在 Python 中是可选的,但它们允许您进行类似于在编译语言中获得的静态类型分析/测试,并且可以使棘手的代码更容易理解):

from typing import Callable, List, Tuple

Condition = Callable[[List[int]], bool]

letters: List[Tuple[str, Condition]] = [
    ("A", lambda args: args[0] <= args[1] <= args[2]),
    ("B", lambda args: args[0] <= args[1] >= args[2]),
    ("C", lambda args: args[0] >= args[1] >= args[2]),
]

def alphabet(args: List[int]) -> None:
    print(next(letter for letter, condition in letters if condition(args)))

请注意,在类型注释版本中,我们可以将Condition定义为“一个接受整数列表并返回布尔值的函数”的方便类型别名。 我们不需要实际创建一个新类或定义一个新的抽象接口,因为函数是 Python 中的一等对象,它们的接口已经完美地适合这个用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM