如何将函数包装为类?

Ale*_*eft 2 python

我有一个功能,说:

def func(arg1, arg2=5):
    blah blah
Run Code Online (Sandbox Code Playgroud)

不幸的是,我正在使用的库要求将输入作为类的实例,所以我不能仅仅将自定义函数传递给上面。

我需要一个class wrapper环绕它,以便传递: MyClass(arg2=4)结果是上面显示的函数,可以将第二个参数设置为4来执行该函数。

我怎样才能做到这一点?

我的尝试: lambda x: func(x, arg2=4)

但是,这不是类的实例。我想模仿该库,其中的函数是类的实例。

Lau*_*nol 5

您可以使用__call__类的功能。

class CallableObject(object):
    def __init__(self, f):
        self.f = f

    def __call__(self, *args, **kwargs):
        return self.f(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

那么您可以像这样“调用”该类:

def func(arg1, arg2=5):
    return arg1 + arg2

callable_object = CallableObject(func)
callable_object(1, 3)
Run Code Online (Sandbox Code Playgroud)

返回4

__init__中的args

要在实例化类时提供参数,可以将其添加到init中

class CallableObject(object):
    def __init__(self, f, *args, **kwargs):
        self.f = f
        self.args = args
        self.kwargs = kwargs

    def __call__(self):
        return self.f(*self.args, **self.kwargs)
Run Code Online (Sandbox Code Playgroud)

用法将变为:

def func(arg1, arg2=5):
    return arg1 + arg2

callable_object = CallableObject(func, 1, arg2=3)
callable_object()
Run Code Online (Sandbox Code Playgroud)

返回4

你仍然可以打电话

def func(arg1, arg2=5):
    return arg1 + arg2

callable_object = CallableObject(func, 1)
callable_object()
Run Code Online (Sandbox Code Playgroud)

返回6(arg2 = 5)