2009-04-01 3 views

ответ

124

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

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

def method1(): 
    return 'hello world' 

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

method2(method1) 
+1

Ничего себе, на удивление просто. –

+1

@MattFletcher Простота Python всегда поражает меня (исходит из C++). – GHC

+0

@David Z как передать аргументы в методе 1? – Geek

22

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

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

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

Что делать, если нет экземпляра 'foo'? –

+0

Тогда вам просто не нужно Foo, например .: определение функции method1(): передача Защиту method2 (метод) метод возврата() method2 (method1) ' – Tom

5

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

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

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

foo(bar) 

Выходы:

Running parameter f(). 
In bar(). 

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

10

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

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

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

Смежные вопросы