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

self.method2(self.method1)

def method1(self):
    return 'hello world'

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

当前回答

方法和其他对象一样都是对象。所以你可以传递它们,把它们存储在列表和字典中,做任何你喜欢的事情。它们的特殊之处在于它们是可调用对象,所以你可以对它们调用__call__。当你调用方法时,不管是否带参数,__call__都会被自动调用,所以你只需要编写methodToRun()。

其他回答

方法和其他对象一样都是对象。所以你可以传递它们,把它们存储在列表和字典中,做任何你喜欢的事情。它们的特殊之处在于它们是可调用对象,所以你可以对它们调用__call__。当你调用方法时,不管是否带参数,__call__都会被自动调用,所以你只需要编写methodToRun()。

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

class Foo(object):
    def method1(self):
        pass
    def method2(self, method):
        return method()

foo = Foo()
foo.method2(foo.method1)

这并不是您想要的,但是一个相关的有用工具是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')()

下面是重新编写的示例,以显示一个独立的工作示例:

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()

如果你想传递一个类的方法作为参数,但还没有你要调用它的对象,你可以简单地传递对象,一旦你有它作为第一个参数(即“self”参数)。

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)

这将打印Hello World