是否可以将方法作为参数传递给方法?

self.method2(self.method1)

def method1(self):
    return 'hello world'

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

当前回答

使用lambda函数。 所以如果你没有争论,事情就变得很琐碎:

def method1():
    return 'hello world'

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

method2(method1)

但是假设你在method1中有一个(或多个)参数:

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

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

然后你可以简单地调用method2作为method2(lambda: method1('world'))。

method2(lambda: method1('world'))
>>> hello world
method2(lambda: method1('reader'))
>>> hello reader

我发现这个答案比这里提到的其他答案清晰得多。

其他回答

如果你想传递一个类的方法作为参数,但还没有你要调用它的对象,你可以简单地传递对象,一旦你有它作为第一个参数(即“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

下面是重新编写的示例,以显示一个独立的工作示例:

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

使用lambda函数。 所以如果你没有争论,事情就变得很琐碎:

def method1():
    return 'hello world'

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

method2(method1)

但是假设你在method1中有一个(或多个)参数:

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

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

然后你可以简单地调用method2作为method2(lambda: method1('world'))。

method2(lambda: method1('world'))
>>> hello world
method2(lambda: method1('reader'))
>>> hello reader

我发现这个答案比这里提到的其他答案清晰得多。

是的,函数(和方法)是Python中的第一类对象。以下工作:

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

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

foo(bar)

输出:

Running parameter f().
In bar().

使用Python解释器或IPython shell来回答这类问题非常简单。

是的,这是可能的。就叫它:

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

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