Как передать метод в качестве параметра в Python

Аналогичное решение для @gcedo , но без необходимости добавления промежуточного содержимого, чтобы подтолкнуть нижний колонтитул. Мы можем просто добавить margin-top:auto в нижний колонтитул, и он будет сдвинут в нижнюю часть страницы независимо от его высоты или высоты содержимого выше.

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  margin:0;
}

.content {
  padding: 50px;
  background: red;
}

.footer {
  margin-top: auto;
  padding:10px;
  background: green;
}
some content here
some content

151
задан Mateusz Piotrowski 9 March 2017 в 10:09
поделиться

5 ответов

Да это, просто используйте название метода, как Вы записали. Методы/функции являются объектами в Python, точно так же, как что-либо еще, и можно передать их вокруг способа, которым Вы делаете переменные. На самом деле можно думать о методе (или функция) как переменная, значение которой является фактическим вызываемым объектом кода.

К вашему сведению, существует нет call метод - я думаю, что это называют __call__, но Вы не должны вызывать его явно:

def method1():
    return 'hello world'

def method2(methodToRun):
    result = methodToRun()
    return result

method2(method1)

Если Вы хотели method1 чтобы быть названными с аргументами, затем вещи становятся сложными. method2 должен быть записан с небольшим количеством информации о том, как передать аргументы method1, и это должно получить значения для тех аргументов от где-нибудь. Например, если method1 как предполагается, берет один аргумент:

def method1(spam):
    return 'hello ' + str(spam)

затем Вы могли записать method2 для вызова его с одним аргументом, который передается в:

def method2(methodToRun, spam_value):
    return methodToRun(spam_value)

или с аргументом, что это вычисляет себя:

def method2(methodToRun):
    spam_value = compute_some_value()
    return methodToRun(spam_value)

Можно расшириться, это к другим комбинациям значений передало в и вычисленные значения, как

def method1(spam, ham):
    return 'hello ' + str(spam) + ' and ' + str(ham)

def method2(methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham_value)

или даже с аргументами ключевого слова

def method2(methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham=ham_value)

Если Вы не знаете при записи method2, какие аргументы methodToRun движение должно взять, можно также использовать распаковку аргумента для вызова его универсальным способом:

def method1(spam, ham):
    return 'hello ' + str(spam) + ' and ' + str(ham)

def method2(methodToRun, positional_arguments, keyword_arguments):
    return methodToRun(*positional_arguments, **keyword_arguments)

method2(method1, ['spam'], {'ham': 'ham'})

В этом случае positional_arguments потребности быть списком или кортежем или подобный, и keyword_arguments dict или подобный. В method2 можно изменить positional_arguments и keyword_arguments (например, добавить или удалить определенные аргументы или изменить значения) перед вызовом method1.

234
ответ дан 23 November 2019 в 21:18
поделиться

Да это возможно. Просто назовите его:

class Foo(object):
    def method1(self):
        pass
    def method2(self, method):
        return method()

foo = Foo()
foo.method2(foo.method1)
34
ответ дан 23 November 2019 в 21:18
поделиться

Вот Ваш пример, переписанный для показа автономного рабочего примера:

class Test:
    def method1(self):
        return 'hello world'

    def method2(self, methodToRun):
        result = methodToRun()
        return result

    def method3(self):
        return self.method2(self.method1)

test = Test()

print test.method3()
12
ответ дан 23 November 2019 в 21:18
поделиться

Да; функции (и методы) являются объектами первого класса в Python. Следующие работы:

def foo(f):
    print "Running parameter f()."
    f()

def bar():
    print "In bar()."

foo(bar)

Выводы:

Running parameter f().
In bar().

Эти виды вопросов тривиальны для ответа на использование интерпретатора Python или, для большего количества функций, оболочки IPython.

5
ответ дан 23 November 2019 в 21:18
поделиться

Методы являются объектами как любой другой. Таким образом, можно раздать их, сохранить их в списках и dicts, сделайте то, что Вы любите с ними. Специальная вещь о них, они - вызываемые объекты, таким образом, можно вызвать __call__ на них. __call__ назван автоматически, когда Вы вызываете метод с или без аргументов, таким образом, просто необходимо записать methodToRun().

3
ответ дан 23 November 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: