Возможно ли в python (3) иметь класс, конструктор которого принимает в качестве аргумента функцию, которая затем преобразуется в метод этого экземпляра?
Я хочу сделать что-то вроде:
class Example:
def __init__(self, val1, val2, user_passed_function):
self.val1 = val1
self.val2 = val2
# this next line doesn't quite get what I'm going for...
self.upf = user_passed_function
def user_function_doer(self, *args, **kwargs):
# THIS LINE IS KEY
return self.upf(*args, **kwargs)
def upf1(instance, arg):
return instance.val1 + arg
def upf2(instance, arg):
return instance.val2 + arg
, а затем иметь следующее:
ex1 = Example(1, 2, upf1)
ex1.user_function_doer(10)
## should return 1 + 10 = 11
ex2 = Example(1, 2, upf2)
ex2.user_function_doer(10)
## should return 2 + 10 = 12
Мой фактический вариант использования немного сложнее, чем этот, но в основном я хочу иметь возможность передать функцию во время создания, которая позже у него будет возможность доступа к атрибутам в экземпляре.
Возможно?
Думаю, если я изменю строку после комментария # THIS LINE IS KEY
на чтение:
def user_function_doer(self, *args, **kwargs):
# THIS LINE IS KEY
return self.upf(self, *args, **kwargs)
все может обойтись. Но кажется странным, что нужно явно писать здесь аргумент self
... для реальных методов экземпляра он будет передаваться автоматически. Есть ли способ добиться этого?