Skip to main content
 首页 » 编程设计

Python:将参数卡住到类 __init__ 函数中

2025年05月04日14虾米姐

假设我有一个看起来像这样的类:

  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)