如何在Python中将方法作为参数传递

问题描述 投票:146回答:7

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

self.method2(self.method1)

def method1(self):
    return 'hello world'

def method2(self, methodToRun):
    result = methodToRun.call()
    return result
python parameter-passing
7个回答
216
投票

是的,只需使用方法的名称,就像你写的那样。方法/函数是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)

如果你不知道,在编写qazxsw poi时,qazxsw poi会采用什么参数,你也可以使用参数解包来以通用的方式调用它:

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之前修改method2positional_arguments(例如,添加或删除某些参数或更改值)。


33
投票

对的,这是可能的。只需称呼它:

keyword_arguments

12
投票

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

method1

5
投票

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

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) shell。


3
投票

如果你想传递一个类的方法作为一个参数但是还没有你要调用它的对象,你只需将它作为第一个参数传递给对象(即“自我”)参数)。

Running parameter f().
In bar().

这将打印“Hello World”


2
投票

方法就像任何其他对象一样。所以你可以传递它们,将它们存储在列表和词典中,随心所欲地做任何事情。关于它们的特殊之处在于它们是可调用对象,因此您可以在它们上调用IPython。当您使用或不使用参数调用方法时,会自动调用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) ,因此您只需要编写__call__


2
投票

很多很好的答案,但很奇怪,没有人提到使用__call__功能。 所以,如果你没有争论,那么事情变得非常简单:

methodToRun()

但是说你在lambda中有一个(或多个)参数:

def method1():
    return 'hello world'

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

method2(method1)

然后你可以简单地调用method1作为def method1(spam): return 'hello ' + str(spam) def method2(methodToRun): result = methodToRun() return result

method2

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

© www.soinside.com 2019 - 2024. All rights reserved.