Python设计模式:嵌套抽象类

don*_*208 5 oop abstract-class design-patterns python-3.x

在下面的示例代码中,我希望每个car对象都由brake_system和组成,并engine_system作为属性存储在汽车上。

为了实现这一点,我定义了CarBreakSystem并将EngineSystem其定义为抽象类。每个子类Car需要定义其各自BreakSystemEngineSystem作为类属性的子类。

这种方法有潜在的问题吗?还是还有其他更适合处理嵌套抽象的设计模式?

from abc import ABC, abstractmethod

class Car(ABC):
    """
    every car object should have an Engine object and a BrakeSystem object
    """

    def __init__(self):
        self.engine_system = self._engine_type()
        self.brake_system = self._brake_type()

    @property
    @abstractmethod
    def _engine_type(self):
        raise NotImplementedError()

    @property
    @abstractmethod
    def _brake_type(self):
        raise NotImplementedError()

class EngineSystem(ABC):
    pass

class BrakeSystem(ABC):
    pass


class FooBrakeSystem(BrakeSystem):
    pass

class FooEngineSystem(EngineSystem):
    pass

class FooCar(Car):
    _engine_type = FooEngineSystem
    _brake_type = FooBrakeSystem

if __name__ == '__main__':
    obj = FooCar()
Run Code Online (Sandbox Code Playgroud)

Dmy*_*iuk 5

我希望每个汽车对象都由brake_systemengine_system对象组成

您有系统的抽象类

class EngineSystem(ABC):
    pass

class BrakeSystem(ABC):
    pass
Run Code Online (Sandbox Code Playgroud)

汽车必须包含两个系统:

class Car:

    def __init__(self, engine: EngineSystem, brake: BrakeSystem):
        self._engine_system = engine
        self._brake_system = brake

    @property
    def engine_type(self) -> EngineSystem:
        return self._engine_system

    @property
    def brake_type(self) -> BrakeSystem:
        return self._engine_system
Run Code Online (Sandbox Code Playgroud)

现在,如果您需要创建特定的汽车

tesla = Car(ElectroEngine(), Disks())

# or even 
class Tesla(Car):
    def __init__(self):
        super().__init__(ElectroEngine(), Disks())

tesla = Tesla()
Run Code Online (Sandbox Code Playgroud)

这种方法使您可以创建一个car由其组成的系统。