Python:将参数冻结到类_uinit__;函数中

Python:将参数冻结到类_uinit__;函数中,python,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') MyClass = magic_function_to_freeze_some_arg(MyClass,

假设我有一个如下所示的类:

  class MyClass(object):
        def __init__(self, some_arg, param=None):
            self.some_arg = some_arg
            self.param = param
obj = MyClass(1, param='some_string')
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
在大多数情况下,我都是这样初始化类的:

  class MyClass(object):
        def __init__(self, some_arg, param=None):
            self.some_arg = some_arg
            self.param = param
obj = MyClass(1, param='some_string')
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
但是我偶尔会有一个代码路径,它根据一些逻辑设置
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

理想情况下,代码应如下所示:

  class MyClass(object):
        def __init__(self, some_arg, param=None):
            self.some_arg = some_arg
            self.param = param
obj = MyClass(1, param='some_string')
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\u function\u to\u freeze\u some\u arg
的干净实现的想法?有没有办法通过Python标准库实现这一点?

您正在寻找

或者(正如mgilson在评论中提到的),您可以构建自己的匿名构造函数方法

MyClass_new = lambda *args,**kwargs: MyClass(*args, some_arg=1, **kwargs)

不要重复
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)

您可以创建一个或一个
lambda
函数,但在这种情况下,这太过分了。

而且总是有
lambda
函数(如果您不想额外导入):-)谢谢!尝试了这两种方法,它们都有效。不过,我想知道是否可以在不绑定本地名称空间中的新名称的情况下执行此操作?最好继续使用
MyClass
作为代码路径,而不是
MyClass\u new
@Adam实际上
MyClass=partial(MyClass,some_arg=1)
在3.4中抛出一个
UnboundLocalError
,表面上是因为
MyClass
不再受调用
partial
的时间限制。@talwai-huh,奇怪。我认为
partial
将起到闭包的作用,在将函数分配给相同的旧变量名之前,在调用时绑定函数。无论如何,我不会这么做:)是的,这绝对是更干净的代码。但我的示例过于简化,我真正想做的是用一些冻结的参数引发一个
异常
,这意味着我需要立即实例化对象,而不是在
if
块之外。