首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中将方法作为参数传递

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

Stack Overflow用户
提问于 2009-04-01 18:06:54
回答 9查看 252.9K关注 0票数 232

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

代码语言:javascript
复制
self.method2(self.method1)

def method1(self):
    return 'hello world'

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

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-04-01 18:09:04

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

既然您问到了方法,我将在下面的示例中使用方法,但请注意,下面的所有内容都同样适用于函数(除了

参数)。

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

代码语言:javascript
复制
def method1(self):
    return 'hello world'

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

obj.method2(obj.method1)

注意:我相信一个

方法确实存在,即您

可能

从技术上讲

,但是您可能永远不应该显式地这样做。

是用来实现的,而不是从你自己的代码中调用的。

如果你想

使用参数来调用,那么事情就变得有点复杂了。

必须使用一些有关如何将参数传递给

,它需要从某个地方获取这些参数的值。例如,如果

应该有一个论点:

代码语言:javascript
复制
def method1(self, spam):
    return 'hello ' + str(spam)

然后你就可以写

要使用传入的一个参数调用它,请执行以下操作:

代码语言:javascript
复制
def method2(self, methodToRun, spam_value):
    return methodToRun(spam_value)

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

代码语言:javascript
复制
def method2(self, methodToRun):
    spam_value = compute_some_value()
    return methodToRun(spam_value)

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

代码语言:javascript
复制
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)

或者甚至使用关键字参数

代码语言:javascript
复制
def method2(self, methodToRun, ham_value):
    spam_value = compute_some_value()
    return methodToRun(spam_value, ham=ham_value)

如果你不知道,在写的时候

,什么论点

,你也可以使用参数解包来以一种通用的方式调用它:

代码语言:javascript
复制
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'})

在这种情况下

需要是列表或元组或类似的,并且

是一个字典或类似的。在

您可以修改

(例如,添加或移除某些参数或更改值),然后再调用

..。

票数 309
EN

Stack Overflow用户

发布于 2009-04-01 18:11:43

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

代码语言:javascript
复制
class Foo(object):
    def method1(self):
        pass
    def method2(self, method):
        return method()

foo = Foo()
foo.method2(foo.method1)
票数 38
EN

Stack Overflow用户

发布于 2009-04-01 18:13:08

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

代码语言:javascript
复制
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()
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/706721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档