首页 > 解决方案 > 继承与使用一个类的类对象作为另一个类的字段(Python 3)

问题描述

假设我们有一个产品可以通过 ID 号和一个 Quality 字段来识别,该字段又由几个值组成,其中一个是 2d 维度值。这是继承的情况还是仅将对象用作另一个类的字段

在尝试使用 OOP 和类在 Python 中实现上述内容时,我想到了以下内容:

class Dimensions:

    def __init__(self, x, y):
        self.x = x
        self.y = y

class Quality:

    def __init__(self, val1, val2, dimensions):
        self.val1 = val1
        self.val2 = val2
        self.dimensions = Dimensions

class Product:
    def __init__(self, id, quality):
        self.id = id
        self.quality = Quality

我在上面尝试做的事情是通过继承实现的吗?

例如class Product (Quality):

如果是这样,在 Python 中定义上面的类时会是什么样子,我将如何传递父类的特定实例的字段(假设Dimensions是等的父类Quality)?

也许我的问题很幼稚,但我试图理解 Python 的类继承和结构方法;在网上搜索了 Python 中的示例,但找不到可以帮助我理解的示例。如果这在其他地方有答案,请分享链接,或者给我指出正确的方向。

从定义类和实例化每个类的代码中完成上面的示例将非常有帮助。

标签: python-3.xclassoopinheritancecomposition

解决方案


我在上面尝试做的事情是通过继承实现的吗?

继承描述了“是”关系,所以问题是:1/产品是质量吗?和 2/ 是 Product 一个 Dimension 吗?

鉴于您自己的话:

我们有一个产品可以通过一个 ID 号和一个 Quality 字段来识别,该字段又由几个值组成,其中一个是 2d 维度值

这两个问题的答案都是明确的“否”:您的产品“不是”质量,它“具有”质量。这不是一个维度,而是有一个维度的质量。IOW,你想要组合(你已经在你的片段中拥有的东西),而不是继承。

也许我的问题很天真,但我试图了解 Python 的类继承和结构方法

这不是特定于 python 的,只是基本的 OO 设计。著名的“设计模式”一书(原版)的第一部分可能是我所知道的关于 OO 设计的最佳文本之一。

如果您还可以完成我的代码片段来说明类组合的方式(定义可以在这个例子中说明?例如,当实例化一个 Product 实例时,我会为它组成的其他类提供值吗?

这里没有一刀切的规则,它取决于上下文,特别是各种对象的生命周期。以最简单的形式,您明确地实例化每个对象并将它们相互传递,即:

class Dimensions:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Quality:
    def __init__(self, val1, val2, dimensions):
        self.val1 = val1
        self.val2 = val2
        self.dimensions = dimensions

class Product:
    def __init__(self, id, quality):
        self.id = id
        self.quality = quality


dimensions = Dimensions(1, 2)
quality = Quality("A", "B", dimensions)
product = Product(42, quality)

在光谱的另一端,您将所有“原始”值传递给产品,这创造了它的质量,它定义了它的尺寸:

class Dimensions:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Quality:
    def __init__(self, val1, val2, x, y):
        self.val1 = val1
        self.val2 = val2
        self.dimensions = Dimensions(x, y)

class Product:
    def __init__(self, id, val1, val2, x, y):
        self.id = id
        self.quality = Quality(val1, val2, x, y)


product = Product(42, "A", "B", 1, 2)

你当然可以使用任何变体,甚至使用它们都提供替代构造函数。这里的主要力量是尺寸和/或质量是否应该在产品之外具有生命,以及它们是否应该在产品之间共享。


推荐阅读