我有一個運行正常的 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))
這可能相當微不足道,但我在谷歌上找不到任何解決方案。非常感謝!
當類這樣調用自身時,它調用的是類中的 __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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句