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

问题描述

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

解决方法

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

在调用 map 函数时可以看到其工作原理的示例。

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

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

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

我们将 list 类的方法作为参数传递给 map()L 在内部处理 def apply(method): myInstance = list() method(myInstance) 中的列表。所以 map() 函数在它内部拥有的列表实例上应用一个方法。

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

{{1}}
,

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

考虑一个简单的类 Foo,其中每个实例保存一个整数值,函数 bar 返回加 1 的值。

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

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

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

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

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) 然后返回 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 实例并返回 int 的东西调用它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...