假设我有一个看起来像这样的类:
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 部分重复自己?我想在代码路径期间卡住位置 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)
