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

Python 是否可以创建具有相同输入的唯一实例?,python,class,object,python-2.7,instance,Python,Class,Object,Python 2.7,Instance,我正在用Python编写代码,创建由键和元素对象组成的复合对象(如化合物)。这些元素对象是通过一些输入(名称、符号、原子序数、原子质量等)创建的。如果我想用元素对象填充数组,并且我希望元素对象是唯一的,这样我就可以对一个元素做一些事情,其余的保持不变,但是它们都应该有与“氢”元素相关的信息 这个问题让我相信我应该创建元素的子类,比如氢元素和碳元素等等 这在不创建子类的情况下可行吗?如果可行,如何实现?基于使概念有意义而不是基于看起来最容易实现的内容来设计对象模型 如果在您的应用程序中,氢原子与氧

我正在用Python编写代码,创建由键和元素对象组成的复合对象(如化合物)。这些元素对象是通过一些输入(名称、符号、原子序数、原子质量等)创建的。如果我想用元素对象填充数组,并且我希望元素对象是唯一的,这样我就可以对一个元素做一些事情,其余的保持不变,但是它们都应该有与“氢”元素相关的信息

这个问题让我相信我应该创建元素的子类,比如氢元素和碳元素等等


这在不创建子类的情况下可行吗?如果可行,如何实现?

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

如果在您的应用程序中,氢原子与氧原子是不同类型的东西,那么您需要一个
类和一个
类,这两个类都可能是
元素
类的子类*

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

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

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))
…或:

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


*当然,你甚至可能需要更多的子类,例如,区分氧-16、氧-17、氧-18,或者甚至可能是不同的混合物,比如99.762%的氧-16和少量的-18,以及地球大气中标准的其他微量元素,与数百万年前常见的不同组合相比……

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

如果在您的应用程序中,氢原子与氧原子是不同类型的东西,那么您需要一个
类和一个
类,这两个类都可能是
元素
类的子类*

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

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

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))
…或:

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


*当然,你甚至可能需要更多的子类,例如,区分氧-16、氧-17、氧-18,或者甚至可能是不同的混合物,比如99.762%的氧-16和少量的-18,以及地球大气中标准的其他微量元素,与数百万年前常见的不同组合相比……

你所说的“子对象”是什么意思?就像你链接到的问题中的提问者一样,我认为你也对类和对象感到困惑。如果
Element
是一个类,并且您创建了一个实例化该类来表示氢,那么您已经创建了一个“氢对象”。您可以使用同一个类来创建“碳对象”或“铁对象”等等。所有这些对象都是独立的(某些对象除外)instance1=Class(args)。Instance2=类(args)。两个相同但唯一的实例。此外,还可以查看复制模块。您可能希望了解复制和面向对象编程之间的区别。Python和大多数其他语言都是基于类的,但有些语言(特别是JavaScript)的工作方式与您期望的一样。@wnnmaw和Max-我也是这么想的,直到打印数组显示“distinct”对象都有相同的指针。除非我误解了指针是如何工作的,它向我表明它们都是相同的对象。你说的“子对象”是什么意思?就像你链接到的问题中的提问者一样,我认为你也对类和对象感到困惑。如果
Element
是一个类,并且您创建了一个实例化该类来表示氢,那么您已经创建了一个“氢对象”。您可以使用同一个类来创建“碳对象”或“铁对象”等等。所有这些对象都是独立的(某些对象除外)instance1=Class(args)。Instance2=类(args)。两个相同但唯一的实例。此外,还可以查看复制模块。您可能希望了解复制和面向对象编程之间的区别。Python和大多数其他语言都是基于类的,但有些语言(特别是JavaScript)的工作方式与您期望的一样。@wnnmaw和Max-我也是这么想的,直到打印数组显示“distinct”对象都有相同的指针。除非我误解了指针是如何工作的,它向我表明它们都是相同的对象,而类作为“事物类型”的概念肯定建议创建
Hydrogen
Oxygen
子类,否则我认为这种方法不能扩展到118个不同的元素。我会用一种不同的方式来区分元素。@user2357112:这取决于你的应用程序。首先,你可能没有118种不同类型的东西。另一方面,如果有必要,子类本身可以是动态的——例如,创建它们并以它们的名称或原子序数将它们存储在dict中,然后取代
Hydrogen()*2+Oxygen()
您可以拥有
元素['Hydrogen']()*2+元素['Oxygen']()*2