我想将一个实例方法作为参数传递给一个函数,该函数将其应用于它内部拥有的实例。这在 Python 中可行吗?
答案 0 :(得分:1)
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], [6, 7, 8]]
我们将 list
类的方法作为参数传递给 map()
,L
在内部处理 def apply(method):
myInstance = list()
method(myInstance)
中的列表。所以 map() 函数在它内部拥有的列表实例上应用一个方法。
为了做同样的事情,你可以定义一个方法或函数,它需要一个方法作为参数,并在调用它时添加你的对象实例作为第一个参数:
{{1}}
答案 1 :(得分:0)
通过将方法作为 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
的东西调用它。