我正在研究Python中的代码,它创建了由Bond和Element对象组成的Compound对象(如化合物)。这些Element对象是通过一些关于它们的输入(名称,符号,原子序数,原子质量等)创建的。如果我想用Element对象填充数组,并且我希望Element对象是唯一的,那么我可以对其中一些做一些事情并保持其余部分不变,但它们都应该具有与'Hydrogen'元素相关的信息。
这个问题Python creating multiple instances for a single object/class让我相信我应该为Element创建子类 - 即Hydrogen对象和Carbon对象等。
这是否可以在不创建子类的情况下实现,如果是这样,怎么办?
答案 0 :(得分:6)
基于使概念有意义而不是基于最容易实现的概念来设计对象模型。
如果在你的应用中,氢原子是与氧原子不同的类型,那么你想要一个Hydrogen
类和一个Oxygen
类,它们都可能是{{1}的子类}。class。*
另一方面,如果氢气或氧气没有什么特别之处(例如,如果你不想区分氧气和硫磺,因为它们都具有相同的化合价),那么你就不会想要子类。
无论哪种方式,您都可以创建多个实例。这只是你是否这样做的问题:
Element
......或者这个:
atoms = [Hydrogen(), Hydrogen(), Oxygen(), Oxygen()]
如果你的实例需要很多参数,并且你想要大量具有相同参数的实例,那么像这样重复自己可能是一件坏事。但是你可以使用一个循环 - 一个显式语句或理解 - 来使它更好:
atoms = [Element(1), Element(1), Element(-2), Element(-2)]
......或:
for _ in range(50):
atoms.append(Element(group=16, valence=2, number=16, weight=32.066))
*当然,您甚至可能需要更多的子类,例如,区分氧气-16,氧气-17,氧气-18,甚至可能是不同的混合物,如99.762%氧气-16,少量-18和微小在地球大气层中标准化的其他物质,与数百万年前常见的不同混合物相比......