【问题标题】:Converting Python Script to C++ [closed]将 Python 脚本转换为 C++ [关闭]
【发布时间】:2021-12-21 16:36:31
【问题描述】:

我有一个可以正常运行的 Python 脚本。但我需要将此脚本实现为 C++ 中的根宏。由于我对python语法不是很熟悉,所以我很难。

ATOMIC_MASS = 931.4940954e6  


class ReducedMomentum:
    def __init__(self, mass):
        self.mass = mass

    def __call__(self, kinetic_energy):
        return math.sqrt(kinetic_energy * (kinetic_energy + 2 * self.mass)) / self.mass


class MassFraction:
    def __init__(self, tritium_mass, electron_mass):
        self.tritium_mass = tritium_mass
        self.electron_mass = electron_mass

    def __call__(self, spectator_mass):
        return spectator_mass / (spectator_mass + self.tritium_mass + 2 * self.electron_mass)


class Ktilde:
    def __init__(self, alpha_1, tritium_mass, electron_mass_eV):
        self.alpha_1 = alpha_1
        self.mass_fraction = MassFraction(tritium_mass, electron_mass_eV / ATOMIC_MASS)
        self.reduced_momentum = ReducedMomentum(electron_mass_eV)

    def __call__(self, spectator_mass, electron_kinetic_energy):
        return self.alpha_1 * self.mass_fraction(spectator_mass) * self.reduced_momentum(electron_kinetic_energy)

我已经理解了前几行,但主要问题是以下部分:

        self.mass_fraction = MassFraction(tritium_mass, electron_mass_eV / ATOMIC_MASS)

在此下方的行。如何将这些行转换为 C++?它们在数学上究竟是什么意思?

熟悉的台词又出现了几次:

    ktilde = Ktilde(alpha_1, spectator_masses, electron_mass)
    mass_spectator = parse_spectator_mass(args, parser)
    ktilde_value = ktilde(mass_spectator, args.energy)
    print('{:.4f}'.format(ktilde_value))

这可能很简单,但我在 Google 上找不到任何解决方案。非常感谢!

【问题讨论】:

  • 在我看来,python 编写器过度使用了 __call__ (而且确实缺少参数的文档字符串),但希望您至少对类机制有更好的了解。转换实际上应该是一对一的,只需正确输入参数(我认为它们都是浮点数或双精度数)。

标签: python c++


【解决方案1】:

当类这样调用自身时,它调用的是类中的 __call__ 方法,例如 operator()。 __init__ 类似于构造函数,在类被实例化时被调用,因此在类到达 __call__ 时 init 中的所有内容都可用。

class ReducedMomentum:
    # here is where an instance of the object calls itself
    def __call__(self, kinetic_energy):
        """Example
           reduced_momentum = ReducedMomentum(5)
           reduction = reduced_momentum(5)
        """
        return math.sqrt(kinetic_energy * (kinetic_energy + 2 * self.mass)) / self.mass

例如,对于您的 Ktilde 类

class Ktilde:
    def __init__(self, alpha_1, tritium_mass, electron_mass_eV):
        """Constructor needing above arguments
           alpha_1: float?
           tritium_mass: float?
           electron_mass_eV: float?

           Example:
           k_tilde = Ktilde(1., 1., 1.)  # initialize with params
           some_spectator_mass = 2.  # some other relevant numbers
           some_electron_KE = 302.1
           calculation = k_tilde(some_spectator_mass, some_electron_KE)  # uses the __call__ method in this class
        """
        self.alpha_1 = alpha_1
        self.mass_fraction = MassFraction(tritium_mass, electron_mass_eV / ATOMIC_MASS)
        self.reduced_momentum = ReducedMomentum(electron_mass_eV)

    def __call__(self, spectator_mass, electron_kinetic_energy):
        return self.alpha_1 * self.mass_fraction(spectator_mass) * self.reduced_momentum(electron_kinetic_energy)

原来如此

    ktilde = Ktilde(alpha_1, spectator_masses, electron_mass)  # ktilde instance
    mass_spectator = parse_spectator_mass(args, parser)  # some function to get mass of spectator
    ktilde_value = ktilde(mass_spectator, args.energy)  # uses __call__ method of KTilde, args is some object (maybe from argparser) that has an energy attribute
    print('{:.4f}'.format(ktilde_value))

【讨论】:

  • “类何时调用自身”?你是说MassFraction(a,b)这行吗?那就是调用初始化器
  • @SirGuy,哦,很好,在这种情况下调用了 init。迷失在 OP 代码分解中。
  • __call__ 在 Python 中类似于 operator() 在 C++ 中。
  • 因此,'self.mass_fraction = MassFraction(a,b) 行调用了初始化程序'类 MassFraction,并将 self.tritium_mass 替换为 a,将 self.electron_mass 替换为 b。我理解对了吗?
  • 非常感谢,帮了大忙!感谢您的回答,我已设法将其转换为 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多