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


можно ли передать метод в качестве параметра в метод?

self.method2(self.method1)

def method1(self):
    return 'hello world'

def method2(self, methodToRun):
    result = methodToRun.call()
    return result
6 111

6 ответов:

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

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

def method1():
    return 'hello world'

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

method2(method1)

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

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

foo = Foo()
foo.method2(foo.method1)

вот ваш пример переписан, чтобы показать автономный рабочий пример:

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()

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

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

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

foo(bar)

выходы:

Running parameter f().
In bar().

такие вопросы тривиальны для ответа с помощью интерпретатора Python или, для получения дополнительных функций, IPython shell.

методы являются объектами, как и любой другой. Таким образом, вы можете передавать их по кругу, хранить их в списках и диктантах, делать с ними все, что вам нравится. Особенность их в том, что они являются вызываемыми объектами, поэтому вы можете вызвать __call__ на них. __call__ вызывается автоматически при вызове метода с аргументами или без них, поэтому вам просто нужно написать methodToRun().

Если вы хотите передать метод класса в качестве аргумента, но еще не имеете объекта, на котором вы собираетесь его вызвать, вы можете просто передать объект, как только у вас есть его в качестве первого аргумента (т. е. аргумент "self").

class FooBar:

    def __init__(self, prefix):
        self.prefix = prefix

    def foo(self, name):
        print "%s %s" % (self.prefix, name)


def bar(some_method):
    foobar = FooBar("Hello")
    some_method(foobar, "World")

bar(FooBar.foo)

это будет печатать "Hello World"