Как использовать «лямбда» в качестве входных данных внутри класса

#python #numpy #class #dynamic

#python #numpy #класс #динамический

Вопрос:

Я хочу использовать lambda в качестве входных данных для функции класса с именем Integrator . Внутри Integrator класса объект должен вызываться на основе текущего состояния. Я не знаю, как ввести эти объекты в Integrator класс. Не могли бы вы сказать мне, как я могу вызвать созданный объект внутри другого класса? Вот основная программа моделирования:

 # create LJ force object
lj_object = LennardJones(self.sigma, self.epsilon, self.compmethod, self.r_cut, self.box_len)

# create spring force object
sp_object = InterMolecularForce (self.oh_len, self.k_b, self.tet_eq, self.k_tet)

# create Integrator object
integrator_object = Integrator (O_mass, H_mass)

for i in range (grid.shape[0]-1) :

        timespan = (grid [i], grid [i 1])                       

        lj_force =lj_object (new_postate)

        sp_force = sp_object(new_postate)

        new_postate[i 1], new_velocity[i 1] = integrator_object (new_postate, new_velocity, lambda new_postate: lj_object (new_postate)   sp_object(new_postate), timespan)

return new_postate, new_velocity
 

Интегратор :

 # calculate half step momenta
momenta_half_step = diag_mass * velocity   (force * (timespan[1] - timespan[0]) / 2)
position_full_step = posate   (timespan[1] - timespan[0]) * np.dot (inv(mass_matrix), momenta_half_step) 

# calculate forces
lj_force = lj_object (position_full_step)
spring_force = sp_object(position_full_step)
force = lj_force   spring_force

momenta_full_step = momenta_half_step   ( timespan[1] - timespan[0] ) * force / 2
 

Комментарии:

1. Я считаю, что этот вопрос трудно понять, потому что код рассказывает нам о том, что делает ваш код: вопрос не объясняет четко, что вы хотите, чтобы он делал. Вопрос в том, как мне передать лямбда-функцию в метод класса?

2. ДА. Как мне передать лямбда-функцию в метод класса?

3. Разве вы уже не передаете при вызове integrator_object ?

Ответ №1:

У меня сильное ощущение, что я здесь упустил главное. Но без попыток какой-либо сложной прикладной математики, которую выполняет ваш код, вот простой, простой подход к передаче функции, определенной в операторе lambda, и передаче ее в класс для использования.

 class Operation:
    def __init__(self, operator):
        self.operator = operator
    def compute(self, *operands):
        return self.operator(operands[0], operands[1])


>>> addition=Operation(operator=lambda a,b: a b)
>>> multiplication=Operation(operator=lambda a,b: a*b)
>>> addition.compute(3,5)
8
>>> multiplication.compute(3,5)
15
 

Это намеренно упрощено и надуманно: он не проверяет типы, он не обрабатывает и не отклоняет операторы, которые не являются двоичными, и в целом это не очень полезно. Его единственная цель — показать, как вызвать функцию, которая была передана в класс, что, по-видимому, является основным моментом вашего вопроса.