Python 将实例方法作为参数传递

Python passing instance methods as arguments

我想将一个实例方法作为参数传递给一个函数,该函数将它应用于它内部拥有的一个实例。这在 Python 中可行吗?

这在 Python 中很容易实现,方法是将方法作为 callable 传递,并将 self 作为此可调用对象的第一个参数传递。

考虑一个简单的 class Foo,其中每个实例都使用一个函数 bar 保存一个整数值,该函数 returns 将值加 1。

class Foo:
    def __init__(self, val: int):
        self.val = val

    def bar(self) -> int:
        return self.val + 1

对外使用这个class时,写Foo(3).bar()是正常的。在这种情况下,Foo(3)Foo 的一个实例,并作为 bar() 中的 self 参数传递。
请注意,改写 Foo.bar(Foo(3)) 是完全合法的。虽然您通常应该避免这种情况,但当您想要将函数而不是实例传递给方法时,它会很有用。

考虑函数 print_res,它接收应用于 Foo 的特定实例并打印结果的 callable(方法,函数)。

def print_res(fun):
    one = Foo(1)
    print(fun(one))  # Pass the instance as the 'self' argument in the given callable.

调用 print_res(Foo.bar) 然后 returns 2.

传递任意可调用对象是行不通的。例如传递 print,将 print(fun(one)) 转换为 print(print(one)。显然,这是无意的行为。这就是为什么您应该考虑添加类型注释以指示所需参数和可调用结果类型的原因。

from typing import Callable

def print_res(fun: Callable[[Foo], int]):
    one = Foo(1)
    print(fun(one))  # Pass the instance as the 'self' argument in the given callable.

这将向用户表明应该使用带有 Foo 和 returns 和 int.

实例的东西来调用它

Python 对象方法是将实例作为第一个参数的函数。调用 myInstance.method(x) 类似于调用 type(myInstance).method(myinstance,x)

可以在调用地图函数时查看其工作原理的示例。

L = [ [1,2,3],[4,5],[6,7,8,9] ]

print(*map(list.pop,L)) # 3 5 9

print(L) # [[1, 2], [4], [6, 7, 8]]

我们将 list class 的方法作为参数传递给 map(),它在内部处理 L 中的列表。所以 map() 函数在它内部的列表实例上应用了一个方法。

为了做同样的事情,您可以定义一个方法或函数,该方法或函数需要一个方法作为参数,并在调用它时将您的对象实例添加为第一个参数:

def apply(method):
    myInstance = list()
    method(myInstance)