是否可以将方法作为参数传递给方法?
self.method2(self.method1)
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun.call()
return result
是的,只需使用方法的名称,就像你写的那样。方法/函数是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
之前修改method2
和positional_arguments
(例如,添加或删除某些参数或更改值)。
对的,这是可能的。只需称呼它:
keyword_arguments
以下是您重写的示例,以显示一个独立的工作示例:
method1
是;函数(和方法)是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。
如果你想传递一个类的方法作为一个参数但是还没有你要调用它的对象,你只需将它作为第一个参数传递给对象(即“自我”)参数)。
Running parameter f().
In bar().
这将打印“Hello World”
方法就像任何其他对象一样。所以你可以传递它们,将它们存储在列表和词典中,随心所欲地做任何事情。关于它们的特殊之处在于它们是可调用对象,因此您可以在它们上调用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__
。
很多很好的答案,但很奇怪,没有人提到使用__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
我发现这比这里提到的其他答案更清晰。