Как заставить функцию ничего не делать, не определив ее?

#python

#python

Вопрос:

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

 class MyObj:
    def __init__(self):
        self.bind = self.donothing #variable that may or may not be set by the parent

    def func(self):
        """Function to be called by the parent"""
        self.bind()

        ## do stuff

    @staticmethod
    def donothing():
        pass
  

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

1. Я думаю, вы ищете декораторов. Читайте о них

2. Каков фактический вариант использования? Если вы хотите определить вызов getattr, который по умолчанию используется для вашего бездействия, это вариант, но трудно сказать, в чем проблема, которую вы пытаетесь решить, и, следовательно, какие решения могут быть подходящими.

3. Что не так с этим решением?

Ответ №1:

Вы можете сделать что-то вроде:

 class MyObj:
    def __init__(self):
        self.bind = None

    def func(self):
        """Function to be called by the parent"""
        if self.bind:
            self.bind()

            ## do stuff

    def define_function(self, f):
        self.bind = f
  

Функции, как и другие объекты, могут использоваться в качестве параметров методов. Просто инициализируйте свою переменную без значения и присвоите ей значение, используя установщик.

Ответ №2:

Я задал этот вопрос некоторое время назад, не зная ответа. С тех пор я узнал, что ответ будет:

 class MyObj:
    def __init__(self):
        self.bind = lambda *a, **b: ()

    def func(self):
        """Function to be called by the parent"""
        self.bind()

        ## do stuff