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

Dan*_*nno 1 python class object instance python-2.7

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

这个问题Python为单个对象/类创建多个实例让我相信我应该为Element创建子类 - 即Hydrogen对象和Carbon对象等.

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

aba*_*ert 6

基于使概念有意义而不是基于最容易实现的对象来设计对象模型.

如果在你的应用中,氢原子是与氧原子不同的类型,那么你想要一个Hydrogen类和一个Oxygen类,它们都可能是一个Element类的子类.*

另一方面,如果氢气或氧气没有什么特别之处(例如,如果您不想区分氧气和硫磺,因为它们都具有相同的化合价),那么您不需要子类.

无论哪种方式,您都可以创建多个实例.这只是你是否这样做的问题:

atoms = [Hydrogen(), Hydrogen(), Oxygen(), Oxygen()]
Run Code Online (Sandbox Code Playgroud)

… 或这个:

atoms = [Element(1), Element(1), Element(-2), Element(-2)]
Run Code Online (Sandbox Code Playgroud)

如果你的实例需要很多参数,并且你想要大量具有相同参数的实例,那么像这样重复自己可能是一件坏事.但是你可以使用一个循环 - 一个显式语句或理解 - 来使它更好:

for _ in range(50):
    atoms.append(Element(group=16, valence=2, number=16, weight=32.066))
Run Code Online (Sandbox Code Playgroud)

… 要么:

atoms.extend(Element(group=16, valence=2, number=16, weight=32.066) 
             for _ in range(50))
Run Code Online (Sandbox Code Playgroud)

*当然,您甚至可能需要更多的子类,例如,区分氧气-16,氧气-17,氧气-18,甚至可能是不同的混合物,如99.762%的氧气-16,少量的-18和微量的其他那些在地球大气层中的标准,与数百万年前常见的不同混合物相比......