我正在尝试让一堂课用单位吐出一个数字。它具有单位的目的是以后可以使用该数字,但不会让单位以字符串的形式出现。虽然我不知道该怎么做。我对(实际上是理解的)类很陌生,甚至不确定我问的内容是否可行。
我的目标是根据原子的质子,电子和中子来制造原子。我想尝试的是在尝试打印时能够看到质量单位(以我的千克为单位)。这是我所拥有的:
class Atom:
def __init__(self, protons, electrons, neutrons):
ElemCharge = 1.6021765*(10**-19)
UMAS = 1.66054*(10**-27)
self.protons = protons
self.electrons = electrons
self.neutrons = neutrons
self.charge = ElemCharge*(self.protons - self.electrons)
self.mass = (self.protons + self.neutrons)*UMAS
def main():
Hydrogen = Atom(1,1,0)
print (Hydrogen.mass)
Argon = Atom(18,18,22)
print (Argon.mass)
if __name__ == "__main__":
main()
这段代码可以很好地工作,所以不用担心:p
有没有办法做到这一点?如果是这样,怎么办?谢谢!
答案 0 :(得分:2)
我不确定这是否正是您要寻找的东西,但是您可以在Atom类中使用一个方法来打印原子的质量以及单位字符串。
class Atom:
def __init__(self, protons, electrons, neutrons):
ElemCharge = 1.6021765*(10**-19)
UMAS = 1.66054*(10**-27)
self.protons = protons
self.electrons = electrons
self.neutrons = neutrons
self.charge = ElemCharge*(self.protons - self.electrons)
self.mass = (self.protons + self.neutrons)*UMAS
def print_mass_str(self):
print('{} {}'.format(self.mass, 'kg'))
然后这个:
Argon = Atom(18,18,22)
print(Argon.mass)
Argon.print_mass_str()
将打印:
6.64216e-26
6.64216e-26 kg
答案 1 :(得分:1)
这行得通吗?
基本上,我在property
类中添加了另一个Atom
,以便所有Atom
类型的对象都可以使用它。做到这一点的另一种方法是像处理中子/质子/电子一样通过它。这样,您就可以给定单位来执行自己的计算(如果需要这样做)(例如,您要以克表示氢的重量,而以千克表示氩的重量)
class Atom:
def __init__(self, protons, electrons, neutrons):
ElemCharge = 1.6021765*(10**-19)
UMAS = 1.66054*(10**-27)
self.protons = protons
self.electrons = electrons
self.neutrons = neutrons
self.charge = ElemCharge*(self.protons - self.electrons)
self.mass = (self.protons + self.neutrons)*UMAS
self.massUnit = "kgs"
def main():
Hydrogen = Atom(1,1,0)
print ("{0} {1}".format(Hydrogen.mass,Hydrogen.massUnit))
Argon = Atom(18,18,22)
print ("{0} {1}".format(Argon.mass,Argon.massUnit))
if __name__ == "__main__":
main()
输出
1.66054e-27 kgs
6.64216e-26 kgs
答案 2 :(得分:1)
要覆盖数字的字符串表示形式,请创建包装类:
class FloatWrapper:
def __init__(self, float, unit):
self.float = float
self.unit = unit
def __getattr__(self, key):
try:
return object.__getattr__(self, key)
except AttributeError:
return getattr(self.float, key)
def __str__(self):
return str(self.float) + self.unit
现在在您的__init__
中,在定义self.mass
之后,添加:
self.mass = FloatWrapper(self.mass, 'kg')
答案 3 :(得分:1)
有很多方法可以做到,但是首先您应该问自己是否想要这样做。具有不同的单位可能会造成混乱。您可以将转换放在适当的位置(例如,在读取用户输入后),并使系统仅在给定的单位上工作(这就是为什么我们拥有SI单位的原因)。能够在内部支持多个单元不仅使代码复杂化,而且还带来了另一个可能造成混淆的原因。
有些软件包可以为您做到这一点,例如units
,numericalunits
或pint
。
从units
文档中摘录的一个示例是:
>>> from units import unit
>>> metre = unit('m')
>>> second = unit('s')
>>> print(metre(10) / second(2))
5.00 m / s
>>> print(metre(10) ** 3)
1000.00 m * m * m
查看metre
如何创建仪表值,并跟踪其用法。它还支持定义自定义单位。
因此,您可以简单地将值存储在类中,作为units
或其他包中的值,一切都准备就绪。我对units
的{{3}}进行了调查,而且时间很短,我认为这是学习如何在自己的代码中处理类似内容的好资源。
我必须引用美国国家航空航天局(Nasa Mars)气候轨道器code,这是由于单位差异造成的。