Python:将参数冻结到类__init__函数中

时间:2015-01-29 21:48:59

标签: python

假设我有一个类似这样的类:

  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标准库来做到这一点?

2 个答案:

答案 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() objectlambda函数,但对于这种情况来说是过度杀伤。