在课堂上使用时给出数字单位

时间:2019-05-31 22:02:31

标签: python

我正在尝试让一堂课用单位吐出一个数字。它具有单位的目的是以后可以使用该数字,但不会让单位以字符串的形式出现。虽然我不知道该怎么做。我对(实际上是理解的)类很陌生,甚至不确定我问的内容是否可行。

我的目标是根据原子的质子,电子和中子来制造原子。我想尝试的是在尝试打印时能够看到质量单位(以我的千克为单位)。这是我所拥有的:

    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

有没有办法做到这一点?如果是这样,怎么办?谢谢!

4 个答案:

答案 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单位的原因)。能够在内部支持多个单元不仅使代码复杂化,而且还带来了另一个可能造成混淆的原因。

有些软件包可以为您做到这一点,例如unitsnumericalunitspint

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,这是由于单位差异造成的。