假设我们有一个产品,该产品可以通过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的示例,但找不到一个可以帮助我理解的示例。如果在其他地方有答案,请分享链接,或者指向我正确的方向。
通过定义类并实例化每个类来完成上面代码中的示例将很有帮助。
答案 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)
,您当然可以使用任何变体,甚至可以使用所有变体来提供备用构造函数。这里的主要力量是尺寸和/或质量是否应在产品外部具有生命,以及是否应在产品之间共享。