是否可以将方法作为参数传递给方法?
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_arguments
和 keyword_arguments
(例如添加或删除某些参数或更改值)/。
https://stackoverflow.com/questions/706721/