Parent/children class python 中的结构

Parent/children class structure in python

我目前正在开发一种具有多个计算级别的定价工具。

例如,我有一个对象 Quote,它本身附加了一个或多个 QuoteItem。

我认为应该有 class 继承,但我不想在每次创建 QuoteItem 时都初始化我的 Quote,因为所有 QuoteItem 共享具有相同特征的完全相同的 Quote。

那是 class 继承 super class 吗?或者它应该是 2 个独立的 class ? 我找不到任何关于我认为很常见的场景的文档或资源。

我有一个报价单的列表,我想先创建报价单,然后再创建报价单。如果我从 quoteitems 开始,我觉得它每次都会创建一个完全不是预期行为的报价,因为我的所有 quoteitems 应该只有 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')

或者那两个 class 应该完全独立吗?

欢迎提供有关此类场景的任何用例或文档。 我找到的 parent/subclass 文档只处理非常相似的对象。在我的示例中,它们不相同,它们是子项,即没有引号就不能存在引号项。

谢谢

在这里使用继承并不是最好的方法。让 Quote 有一个包含所有 QuoteItems 的容器(例如列表)。

当像这样使用继承时,您是在说 QuoteItem 是一种特殊的 Quote,但事实并非如此。 QuoteItemQuote 的一部分。

在考虑继承时,您使用的是 "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

您可能在报价中寻找的是 "has-a" 关系。

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)