Python 3.x 用类组合(Python)实现简单的OOP设计

Python 3.x 用类组合(Python)实现简单的OOP设计,python-3.x,class,oop,composition,Python 3.x,Class,Oop,Composition,我正在研究设计模式和最佳实践,尤其是关于课堂作文()。我有一个具体的例子,我发现很难实现一个好的OOP设计 简单(?)示例: 假设有一个车库的概念,它可以容纳汽车,有一个呼叫外部服务,其响应提供车库中每辆汽车的信息 这是一个示例响应,我想为其捕获和创建类: [{'carID': '1x148i-36y5-5rt2', 'carDimensions': {'top': 275, 'left': 279,

我正在研究设计模式最佳实践,尤其是关于课堂作文()。我有一个具体的例子,我发现很难实现一个好的OOP设计


简单(?)示例: 假设有一个车库的概念,它可以容纳汽车,有一个呼叫外部服务,其响应提供车库中每辆汽车的信息

这是一个示例响应,我想为其捕获和创建类:

[{'carID': '1x148i-36y5-5rt2',
          'carDimensions': {'top': 275,
                            'left': 279,
                            'width': 75,
                            'height': 75},
          'carAttributes': {'weight': {'weightLevel': 'medium',
                                       'value': 1.6},
                            'topSpeed': {'sppedLevel': 'good',
                                      'value': 0.7},
                            'noise': {'noiseLevel': 'low',
                                      'value': 0.32},
                            'accessories': [{'optionsLevel': 'poor',
                                             'quality': 2.8}]}},
  {'carID': '223a3-33e5-4ea3',
          'carDimensions': {'top': 241,
                            'left': 234,
                            'width': 71,
                            'height': 65},
          'carAttributes': {'weight': {'weightLevel': 'light',
                                       'value': 1.1},
                            'topSpeed': {'sppedLevel': 'great',
                                      'value': 1.6},
                            'noise': {'noiseLevel': 'high',
                                      'value': 0.97},
                            'accessories': [{'optionsLevel': 'great',
                                             'quality': 3.2}]}}]
下面是我的课堂设计方法

我试着创建一个
Car
类来提取每个字段,如下所示:

class `Car`:

    def __init__(self, car_response_dictionary):
        self.car = car_response_dictionary

    def get_carID(self):
        return self.car.get("carID")

    # etc.
另一个类用于处理基于
CardDimensions
的一些计算:

class Size:

    def __init__(self, top, left, width, height):
        self.top = top
        self.left = left
        self.width = width
        self.height = height

    def get_coordinates(self):
        bottom = self.left + self.height
        right = self.top + self.width
        return (self.left, self.top), (bottom, right)
以及一个类,用于捕获车库的概念,其中包含
汽车
对象的列表:

class Garage:

    def __init__(self, datestamp, cars):
        self.datestamp = datestamp
        self.cars = cars

    # do stuff based on cars
因此,我的想法是创建一个
Garage
的实例,并在
cars
中获取响应列表,我尝试通过迭代
cars
字典列表,并使用类组合为每辆车创建一个
car
实例对象,将每辆车解包为
car
实例对象

在这一点上,我发现用Python实现我的设计是不可能的,我认为我的设计中的方法可能是错误的,或者我对类组成的理解很差


如果有人能为上面的例子提供一个简单的代码实现,那对我来说将是非常有教育意义的。即使这意味着提出了新的设计(例如,我正在考虑做出一个
响应
类)。

下面是几个类和一个使用组合的“main”(使用大小类作为汽车类的数据成员)

输出:

id: 223a3-33e5-4ea3 weight: 12 top speed: 0.74  noise: 0.4345 size: [top: 241 left: 234 width: 71 height: 65]
id: 1x148i-36y5-5rt2 weight: 12 top speed: 0.7  noise: 0.45 size: [top: 275 left: 279 width: 75 height: 75]

谢谢你的回答。我不清楚这如何适用于给定的示例,其中的响应是一个字典列表。我的印象是,我必须遍历该列表,填充每辆车,等等。正是在这一点上,我无法理解“Garage”和“car”类是如何在实现中就位的。因此,如果不是太麻烦的话,请重构您的答案,以便实现解决所提供的示例原因,这正是我难以理解的原因。谢谢你。我已经修改了代码,现在它使用一个目录列表填充车库。你的
get\u id()
方法完全没有用-
Car.id
是一个公共属性,你不需要访问器。brunu-我同意get\u id()这是一个很好的例子,非常感谢!请您简要解释一下
汽车持有者的想法好吗
;它是用来收集汽车的吗?还有,为什么
车库
不能在
\uuuu init\uuuu
汽车列表中输入信息?我的意思是,这是可能的,但实践不好,还是不如您的实现好?
id: 223a3-33e5-4ea3 weight: 12 top speed: 0.74  noise: 0.4345 size: [top: 241 left: 234 width: 71 height: 65]
id: 1x148i-36y5-5rt2 weight: 12 top speed: 0.7  noise: 0.45 size: [top: 275 left: 279 width: 75 height: 75]