【问题标题】:abstract method in an enum in pythonpython中枚举中的抽象方法
【发布时间】:2022-06-25 00:27:23
【问题描述】:

我的问题是,如何在 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;
            }
        }
    }
}

【问题讨论】:

  • 请看stackoverflow.com/questions/36932/…。这是你需要的吗?
  • 看起来您正在寻找一个LetterFactory(名为Alphabet)类,该类基于传递给其主要工厂方法的条件(整数的可迭代)构造一个Letter实例?让它成为 Python enum.Enum 没有特别的优势?

标签: python java enums iteration abstract


【解决方案1】:

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

from typing import Callable, List, Tuple

letters: List[Tuple[str, Callable[[List[int]], bool]]] = [
    ("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)))

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

如果您正在做的事情比示例中的简单条件更复杂,那么定义一个新的抽象接口才是真正合适的 IMO —— 函数是 Python 中的一流对象,其接口已经完全适合这个用例,所以无需将您的条件函数包装在另一个对象、枚举或其他对象中。

【讨论】:

  • 除此之外:每个从 Java 来到 Python 的人都经历了同样的旅程,他们必须打破 Java 给你造成的“一切都需要成为一个类”的创伤。一旦你把它抛在脑后,你会发现代码变得更容易编写。 :)
猜你喜欢
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多