假设我有一个看起来像这样的课:
class MyClass(object):
def __init__(self, some_arg, param=None):
self.some_arg = some_arg
self.param = param
在大多数情况下,我会像这样初始化我的课程:
obj = MyClass(1, param='some_string')
但是我偶尔会有一个代码路径,该路径可param
根据某种逻辑设置关键字参数,同时将some_arg
位置参数保持为恒定值。这段代码看起来像:
if some_condition:
obj = MyClass(1, param='some_string')
elif some_other_condition:
obj = MyClass(1, param='some_other_string')
else:
obj = MyClass(1, param='some_third_string')
我的问题是:我可以避免在MyClass(1
对象实例化的一部分中重复自己吗?我想在代码路径的整个过程中将positional的值冻结some_arg
为1
,并param
在实例化时简单地传递关键字参数。
理想情况下,代码应如下所示:
MyClass = magic_function_to_freeze_some_arg(MyClass, some_arg=1)
if some_condition:
obj = MyClass(param='some_string')
elif some_other_condition:
obj = MyClass(param='some_other_string')
else:
obj = MyClass(param='some_third_string')
print(obj.some_arg) # Always 1 regardless of which if condition is hit
关于什么是干净实现的任何想法magic_function_to_freeze_some_arg
会是什么样子?是否可以通过Python标准库执行此操作?
您正在寻找functools.partial
!
from functools import partial
MyClass_new = partial(MyClass, some_arg=1)
或者(如mgilson在评论中所述),您可以构建自己的匿名构造方法
MyClass_new = lambda *args,**kwargs: MyClass(*args, some_arg=1, **kwargs)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句