继承与将一个类的类对象用作另一个类的字段(Python 3)

时间:2019-02-01 08:11:54

标签: python-3.x class oop inheritance composition

假设我们有一个产品,该产品可以通过ID号和“质量”字段进行识别,而“质量”字段又包含多个值,其中一个是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的Class继承和结构方法。在网上搜索了有关Python的示例,但找不到一个可以帮助我理解的示例。如果在其他地方有答案,请分享链接,或者指向我正确的方向。

通过定义类并实例化每个类来完成上面代码中的示例将很有帮助。

1 个答案:

答案 0 :(得分:2)

  

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

继承描述了“是”关系,因此问题是:1 /产品是质量吗?和2 /产品是维度吗?

给出您自己的话:

  

我们有一个产品,该产品可以通过ID号和“质量”字段进行识别,而“质量”字段又包含多个值,其中一个是2d维值。

两个问题的答案都是明确的“否”:您的产品“不是”质量,而是“具有”质量。这不是维度,而是质量具有维度。 IOW,您想要合成(摘要中已经包含的内容),而不是继承。

  

也许我的问题很幼稚,但是我试图理解Python的类继承和结构化方法

这不是特定于python的,只是基本的OO设计。 the famous "Design patterns" book的第一部分(原始部分)可能是我所了解的有关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)

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