假设我有一个类似这样的类:
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标准库来做到这一点?
答案 0 :(得分:4)
您正在寻找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)
答案 1 :(得分:3)
不是重复MyClass
,而是将参数存储在变量中并应用:
if some_condition:
param = 'some_string'
elif some_other_condition:
param = 'some_other_string'
else:
param = 'some_third_string'
obj = MyClass(1, param=param)
你可以创建一个functools.partial()
object或lambda
函数,但对于这种情况来说是过度杀伤。