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

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

self.method2(self.method1)

def method1(self):
    return 'hello world'

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

最佳答案

是的,只需使用您所写的方法名称即可。方法和函数是 Python 中的对象,就像其他任何东西一样,您可以像处理变量一样传递它们。实际上,您可以将方法(或函数)视为一个变量,其值为实际可调用的代码对象。

由于您询问了方法,因此我在以下示例中使用了方法,但请注意,以下所有内容都同样适用于函数(除了没有 self 参数)。

要调用传递的方法或函数,只需使用绑定(bind)的名称,就像使用方法(或函数)的常规名称一样:

def method1(self):
    return 'hello world'

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

obj.method2(obj.method1)

注意:我相信确实存在 __call__() 方法,即您可以在技术上执行 methodToRun.__call__(),但您可能永远不应该明确地这样做。 __call__() 旨在实现,而不是从您自己的代码中调用。

如果您希望使用参数调用 method1,那么事情会变得有点复杂。 method2 必须包含一些关于如何将参数传递给 method1 的信息,并且它需要从某个地方获取这些参数的值。例如,如果 method1 应该采用一个参数:

def method1(self, spam):
    return 'hello ' + str(spam)

然后你可以编写 method2 来调用它,并使用一个传入的参数:

def method2(self, methodToRun, spam_value):
    return methodToRun(spam_value)

或使用它自己计算的参数:

def method2(self, methodToRun):
    spam_value = compute_some_value()
    return methodToRun(spam_value)

您可以将此扩展为传入的值和计算的值的其他组合,例如

def method1(self, spam, ham):
    return 'hello ' + str(spam) + ' and ' + str(ham)

def method2(self, methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham_value)

甚至使用关键字参数

def method2(self, methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham=ham_value)

如果你不知道,在写method2的时候,methodToRun要取什么参数,你也可以使用参数解包,以通用的方式调用它:

def method1(self, spam, ham):
    return 'hello ' + str(spam) + ' and ' + str(ham)

def method2(self, methodToRun, positional_arguments, keyword_arguments):
    return methodToRun(*positional_arguments, **keyword_arguments)

obj.method2(obj.method1, ['spam'], {'ham': 'ham'})

在这种情况下 positional_arguments 需要是一个列表或元组或类似的,而 keyword_arguments 是一个字典或类似的。在 method2 中,您可以在调用 method1positional_argumentskeyword_arguments(例如添加或删除某些参数或更改值)/。

https://stackoverflow.com/questions/706721/

相关文章:

python - numpy 矩阵向量乘法

python - "hashable"在 Python 中是什么意思?

python - 如何从一列中对 Pandas 数据框进行排序

python - glob.glob() 的返回值是如何排序的?

linux - 什么 linux shell 命令返回字符串的一部分?

python - 在python中跳过for循环的第一个条目?

linux - cd进入目录没有权限

python - pip 安装 : Please check the permissions and

linux - 如何获取 Linux/UNIX 上当前的网络接口(interface)吞吐量统计信息

linux - Linux Bash 中的双与号 (&&) 和分号 (;) 有什么区别?