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
,但事实并非如此。 QuoteItem
是 Quote
的一部分。
在考虑继承时,您使用的是 "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)
我目前正在开发一种具有多个计算级别的定价工具。
例如,我有一个对象 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
,但事实并非如此。 QuoteItem
是 Quote
的一部分。
在考虑继承时,您使用的是 "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)