繁体   English   中英

Python 将实例方法传递为 arguments

[英]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

传递任意可调用对象将不起作用。 例如,传递printprint(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM