Python 为什么要使用不做任何事情的抽象类?

Python 为什么要使用不做任何事情的抽象类?,python,class,oop,Python,Class,Oop,我正在修补一个战略模式的例子,可以在下面找到 from __future__ import annotations from abc import ABC, abstractmethod from typing import List class Context(): def __init__(self,strategy: Strategy) -> None: self._strategy = strategy @property def st

我正在修补一个战略模式的例子,可以在下面找到

from __future__ import annotations
from abc import ABC, abstractmethod
from typing import List

class Context():

    def __init__(self,strategy: Strategy) -> None:
        self._strategy = strategy

    @property
    def strategy(self) -> Strategy:
        return self._strategy
    

    @strategy.setter
    def strategy(self, strategy: Strategy) -> None:
        self._strategy = strategy
    
    def do_some_business_logic(self) -> None:

        print("Context: Sorting data using the strategy (not sure how it'll do it)")
        result = self._strategy.do_algorithm(["a", "b", "c", "d", "e"])
        print(",".join(result))



class Strategy(ABC):

    @abstractmethod 
    def do_algorithm(self, data:List):
        pass



class ConcreteStrategyA(Strategy):
    def do_algorithm(self, data: List) -> List:
        return sorted(data)


class ConcreteStrategyB(Strategy):
    def do_algorithm(self, data: List) -> List:
        return reversed(sorted(data))


if __name__ == "__main__":
    context = Context(ConcreteStrategyA())
    print("Client: Strategy is set to normal sorting.")
    context.do_some_business_logic()
    print()

    print("Client: Strategy is set to reverse sorting.")
    context.strategy = ConcreteStrategyB()
    context.do_some_business_logic()
为什么使用ABC法和抽象法?我试着把它从代码中去掉,代码仍然有效。它增加了什么

为什么使用ABC和抽象方法

在OOP中,它被称为接口。它定义了继承类需要实现的函数原型。在您的示例中,那些
ConcreteStrategyA
ConcreteStrategyB
是从
Strategy
接口继承的具体类

为什么使用空策略类


它不是空的。它定义了派生类继承自的接口。

abstractmethod
是为了强制子类来实现该方法。我找到了您使用的源代码,值得传递链接:好的,我想我现在明白了。因此,接口策略的基本目标是减少bug的可能性。例如,在这种情况下,如果没有Strategy接口,将给开发人员太多的自由,这将导致更高的bug风险。这是正确的吗?这可能是一种解释。对于接口的两个主要用途,您可以查看。