[英]Python passing instance methods as arguments
我想将实例方法作为参数传递给 function ,该方法将其应用于内部拥有的实例。 这在 Python 中是否可行?
Python object 方法是将实例作为其第一个参数的函数。 调用myInstance.method(x)
类似于调用type(myInstance).method(myinstance,x)
调用 map function 时,可以看到这是如何工作的示例。
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() function 在它内部拥有的列表实例上应用了一个方法。
为了做同样的事情,你可以定义一个方法或 function ,它需要一个方法作为参数,并在调用它时添加你的 object 实例作为第一个参数:
def apply(method):
myInstance = list()
method(myInstance)
这在 Python 中很容易实现,方法是将方法作为callable
对象传递,并将self
作为可调用对象的第一个参数传递。
考虑一个简单的 class Foo
,其中每个实例都保留一个 integer 值和一个 function bar
,该条返回添加了 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))
是完全合法的。 虽然您通常应该避免这种情况,但当您想要将 function 而不是实例传递给方法时,它很有用。
考虑 function 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)
。显然,这是意想不到的行为。这就是为什么您应该考虑添加类型注释以指示所需的 arguments 和可调用的结果类型。
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
的东西来调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.