Как передать метод в качестве параметра в Python
можно ли передать метод в качестве параметра в метод?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
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"