我有一个功能,说:
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)
但是,这不是类的实例。我想模仿该库,其中的函数是类的实例。
您可以使用__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)
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |