Python: создать класс, конструктор которого принимает пользовательскую функцию, которая становится методом - PullRequest
0 голосов
/ 06 августа 2020

Возможно ли в 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 ... для реальных методов экземпляра он будет передаваться автоматически. Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 06 августа 2020

Вы упомянули аргумент instance в определении upf1 и upf2 но не проходите self в return self.upf(*args, **kwargs)

return self.upf(self,*args, **kwargs) решает это и, похоже, работает, как ожидалось

Также ... вам не хватает self в def user_function_doer(self,*args, **kwargs):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...