Достигается ли то, что я пытаюсь сделать выше, с помощью наследования?
Наследование описывает отношение "есть", поэтому возникает вопрос: 1 / Является ли продукт качеством?и 2 / Является ли продукт измерением?
Учитывая ваши собственные слова:
у нас есть продукт, который можно идентифицировать по номеру ID, и поле качества, которое, в свою очередь, состоит из нескольких значений, одно из которых равно 2d.размеры значения
ответ на оба вопроса однозначно: «НЕТ»: ваш продукт «не качество, он« имеет »качество.И это не измерение, это качество, которое имеет измерение.Итак, вам нужна композиция (то, что у вас уже есть в вашем фрагменте), а не наследование.
Возможно, мой вопрос наивен, но я пытаюсь понять подход Python к наследованию и структуре классов
Это не что-то специфичное для Python, просто базовый дизайн ОО.Первая часть знаменитой книги «Шаблоны проектирования» (оригинал), возможно, является одним из лучших текстов, которые я знаю об ОО-дизайне.
Если бы вы также могли завершить мойфрагмент кода для иллюстрации того, как составление класса (определение может быть проиллюстрировано в этом примере? например, при создании экземпляра экземпляра Product, я предоставлю значения для других классов, из которых он составлен?
Правило size-fits-all здесь, это зависит от контекста и особенно от жизненного цикла различных объектов.В простейшей форме вы явно создаете экземпляры каждого объекта и передаете их друг другу, то есть:
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)
, и вы, конечно, можете использовать любой вариант и даже использоватьвсе они обеспечивают альтернативные конструкторы. Основные силы здесь в том, должны ли размеры и / или качество иметь жизнь вне продуктов,d должны ли они или не должны быть разделены между продуктами.