don*_*208 5 oop abstract-class design-patterns python-3.x
在下面的示例代码中,我希望每个car对象都由brake_system和组成,并engine_system作为属性存储在汽车上。
为了实现这一点,我定义了Car,BreakSystem并将EngineSystem其定义为抽象类。每个子类Car需要定义其各自BreakSystem和EngineSystem作为类属性的子类。
这种方法有潜在的问题吗?还是还有其他更适合处理嵌套抽象的设计模式?
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)
我希望每个汽车对象都由
brake_system和engine_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由其组成的系统。
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |