是否可以创建具有相同输入的唯一实例?

时间:2014-01-24 21:04:42

标签: python class object python-2.7 instance

我正在研究Python中的代码,它创建了由Bond和Element对象组成的Compound对象(如化合物)。这些Element对象是通过一些关于它们的输入(名称,符号,原子序数,原子质量等)创建的。如果我想用Element对象填充数组,并且我希望Element对象是唯一的,那么我可以对其中一些做一些事情并保持其余部分不变,但它们都应该具有与'Hydrogen'元素相关的信息。

这个问题Python creating multiple instances for a single object/class让我相信我应该为Element创建子类 - 即Hydrogen对象和Carbon对象等。

这是否可以在不创建子类的情况下实现,如果是这样,怎么办?

1 个答案:

答案 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和微小在地球大气层中标准化的其他物质,与数百万年前常见的不同混合物相比......