Answers:
是的,只需使用您编写的方法名称即可。方法/函数是Python中的对象,就像其他任何对象一样,您可以在执行变量的过程中传递它们。实际上,您可以将方法(或函数)视为变量,其值是实际的可调用代码对象。
仅供参考,没有call
方法-我认为它叫做__call__
,但是您不必显式调用它:
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
如果您想method1
使用参数来调用,那么事情会变得有些复杂。method2
必须写一些有关如何将参数传递给的信息method1
,并且它需要从某个地方获取这些参数的值。例如,if 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)
如果您不知道在编写时要使用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
。
是的,有可能。只是称呼它:
class Foo(object):
def method1(self):
pass
def method2(self, method):
return method()
foo = Foo()
foo.method2(foo.method1)
def method1(): pass def method2(method) return method() method2(method1)
很多好的答案,但奇怪的是没有人提到使用lambda
函数。
因此,如果没有参数,事情就会变得很简单:
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
但是请说您在一个(或多个)参数中method1
:
def method1(param):
return 'hello ' + str(param)
def method2(methodToRun):
result = methodToRun()
return result
然后,您可以简单地调用method2
as method2(lambda: method1('world'))
。
method2(lambda: method1('world'))
>>> hello world
method2(lambda: method1('reader'))
>>> hello reader
我发现这里的答案比这里提到的其他答案要干净得多。
()
在回叫中把对象的末尾放进去,duh。
并非完全符合您的需要,但一个相关的有用工具是getattr()
使用方法名称作为参数。
class MyClass:
def __init__(self):
pass
def MyMethod(self):
print("Method ran")
# Create an object
object = MyClass()
# Get all the methods of a class
method_list = [func for func in dir(MyClass) if callable(getattr(MyClass, func))]
# You can use any of the methods in method_list
# "MyMethod" is the one we want to use right now
# This is the same as running "object.MyMethod()"
getattr(object,'MyMethod')()
foo
怎么办?