Наследование против использования объекта класса одного класса в качестве поля другого класса (Python 3) - PullRequest
0 голосов
/ 01 февраля 2019

Скажем, у нас есть продукт, который можно идентифицировать по идентификационному номеру и полю качества, которое, в свою очередь, состоит из нескольких значений, одно из которых представляет собой двумерные значения измерений.Это случай наследования или просто использование объекта в качестве поля другого класса ?

При попытке реализовать вышеизложенное в 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, но не смог найти ни одного, который бы помог мне понять.Если у вас есть ответ в другом месте, пожалуйста, поделитесь ссылкой или, вместо этого, укажите мне правильное направление.

Выполнение приведенного выше примера в коде из определения классов и создания экземпляров каждого из них было бы очень полезно.

1 Ответ

0 голосов
/ 01 февраля 2019

Достигается ли то, что я пытаюсь сделать выше, с помощью наследования?

Наследование описывает отношение "есть", поэтому возникает вопрос: 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 должны ли они или не должны быть разделены между продуктами.

...