对具有 class 属性的值执行操作

Perform operations on values with class attributes

假设我做了一个简单的 class

class mercury:

    class orbial_characteristics:
        apehilion = 69816900
        perihilion = 46001200
        semi_major_axis = 57909050
        eccentricity = 0.205630
        orbital_period = 87.9691*86400
        orbital_speed = 47.362*1e3

现在,此处给出的值以 SI 单位为单位,例如 apehilion 的值以公里为单位。我想制作另一个 class 可以将值转换为给定单位,比如说天文单位。一种方法是将apehilion的值直接传递给那个class

change_to_AU(value_of_apehilion)

相对容易做到。但是,我正在寻找的是 python 核心操作。像这样

merc_apehilion_km = mercury.orbital_characteristics.apehilion
merc_apehilion_au = merc_apehilion_km.change_to_AU()

我最近开始研究 classes,方法是阅读此处的答案和网络教程,但我不知道如何执行此类操作。我什至尝试从 numpypandas 读取核心文件,因为我最常使用的这两个库有很多使用这种表示法的东西。

编辑:

一点研究让我找到了 this 堆栈溢出页面。查看其中提到的库,确保它们得到积极维护,并考虑使用它们来完成我在下面演示的内容

编辑结束

像这样创建自定义方法需要为您的 SI 单位值创建自定义对象。这是一个例子:

class SIUnit:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return self.value

    def to_astronimical_units(self):
        Calculations which convert apehilion to AU go here

        return result

class mercury:

    class orbial_characteristics:
        apehilion = SIUnit(69816900)
        perihilion = SIUnit(46001200)
        semi_major_axis = SIUnit(57909050)
        eccentricity = SIUnit(0.205630)
        orbital_period = SIUnit(87.9691*86400)
        orbital_speed = SIUnit(47.362*1e3)

请记住,to_astronomical_units 方法适用于您使用的所有 SI 单位,而不仅仅是距离,因此您可能需要创建一个基础 SIUnit class 然后再创建一个子单位class 每个 SI 单位,例如:

class SIUnit:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return self.value

class Kilometer(SIUnit):
    def to_au(self):
        Calculations which convert apehilion to AU go here
        return result

class Ampere(SIUnit):
    def to_volts(self, wattage):
        return self.value / wattage