Структура родительских / детских классов в Python - PullRequest
1 голос
/ 09 июня 2019

В настоящее время я работаю над инструментом ценообразования, который имеет несколько уровней вычислений.

Например, у меня есть объект Quote, к которому подключен один или несколько QuoteItem.

Я думаюдолжно быть наследование классов, но я не хочу инициализировать свою цитату каждый раз, когда я создаю QuoteItem, поскольку все QuoteItems разделяют одну и ту же цитату с одинаковыми характеристиками.

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

У меня есть список цитат, которые прикреплены к одной цитате, я хотел бы сначала создать цитату, а затемцитаты.Если я начну с цитат, я чувствую, что каждый раз будет создаваться цитата, которая не соответствует ожидаемому поведению, поскольку для всех моих цитат должна быть только 1 цитата.

Это правильный подход?

class Quote():
    def __init__():
        # this will set parameter global to the quote
        print('Quote created')


class QuoteItem(Quote):
    def __init__():
        # this will set specific details for all quote items attached to one specific quote
        print ('QuoteItem created')

Или эти два класса должны быть полностью независимыми?

Приветствуются любые варианты использования или документация по такому сценарию.Документ родителя / подкласса, который я нашел, имеет дело только с очень похожим объектом.В моем примере они не совпадают, они дети, то есть цитаты не могут существовать без цитаты.

Спасибо

Ответы [ 2 ]

2 голосов
/ 09 июня 2019

Когда вы думаете о наследовании, вы используете отношения "is-a".

class Vehicle(object):  # a Vehicle IS AN object
    pass
class Car(Vehicle):     # a Car     IS A  Vehicle
    pass
class Sedan(Car):       # A Sedan   IS A  Car
    pass

То, что вы, вероятно, ищете в цитате и ее элементах, - это отношение "есть".

class Tire(object):     # a Tire IS AN object, but...
    pass

class Vehicle(object):
    def __init__(self, num_tires=4):
        self.tires = [Tire() for _ in num_tires]
                        # a Vehicle HAS A Tire  (or in this case 4 tires)

Чтобы расширить метафору для вашего конкретного случая использования:

class QuoteItem(object):
    def __init__(self, modelnumber, quantity, totalprice):
        self.modelnumber = modelnumber
        self.quantity = quantity
        self.totalprice = totalprice
        # I'm guessing at what you'd want here


class Quote(object):
    _last_quote_number = 0

    @property
    @classmethod
    def next_quote_number(cls) -> int:
        cls._last_quote_number += 1
        return cls._last_quote_number

    def __init__(self, customerid):
        self.number = self.next_quote_number
        self.customerid = customerid
        self.items = []

    def add_item(self, modelnumber, quantity, totalprice) -> None:
        item = QuoteItem(modelnumber, quantity, totalprice)
        self.items.append(item)

2 голосов
/ 09 июня 2019

Использование наследования здесь не лучший подход.Просто позвольте Quote иметь контейнер (например, список) со всеми его QuoteItems.

При использовании наследования, подобного этому, вы говорите, что QuoteItem - это особый вид Quote, который не является«т.QuoteItem является частью Quote.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...