У меня есть некоторые функции внутри класса, которые работают с членами класса. Эти функции почти идентичны, кроме члена класса, с которым они работают. Чтобы избежать необходимости вводить функцию снова и снова, меняя только измененный член класса, я создал функцию, в которой одним из параметров является член класса, который нужно изменить.
Вот очень упрощенный версия:
class Foo:
a = 0
b = 0
def __set_member(self, member, value):
member = value
def set_a(self, value):
self.__set_member(self.a, value)
f = Foo()
print(f.a)
f.set_a(2)
print(f.a)
Но это выводит:
0
0
в C ++, это можно сделать с помощью:
class Foo {
void set_member(int& member, int value) {
member = value;
}
public:
int a = 0;
int b = 0;
void set_a(int value) {
set_member(this->a, value);
}
};
Очевидно, что приведенный мной пример не требуется функция set_member
, потому что она очень проста.
В моем реальном коде сеттер выглядит примерно так:
def requestOpenDoor1(self):
# Non blocking function: sets door1 to `Opening` and then after 2 seconds sets it to `Open`
self.__door1 = DoorStates.Opening
async def callback(): self.__door1 = DoorStates.Open
self.__tasks.append(AsyncTimer(2, callback))
Один из подходов - скопировать и вставить эту функцию 20 или поэтому время и просто измените изменяемый член класса, состояние перехода, время и endState, но я бы предпочел уменьшить дублирование кода.
Я также пытался использовать декораторы для решения этой проблемы:
class request_function_decorator(object):
def __init__(self, tasks, stateToChange, transitionState, time, endState):
self.__tasks = tasks
self.__stateToChange = stateToChange
self.__transitionState = transitionState
self.__time = time
self.__endState = endState
def __call__(self, function):
def wrapped_f(*args):
self.__stateToChange = self.__transitionState
async def callback(): self.__stateToChange = self.__endState
self.__tasks.append(AsyncTimer(self.__time, callback))
return wrapped_f
@request_function_decorator(__tasks, __door1, States.Opening, 2, States.Open)
def requestOpenDoor1(self):
pass
Но это также не работает.
Как можно обобщить эту функцию, чтобы уменьшить дублирование кода?
Спасибо.