如何无需显式定义子类,用一行代码创建带固定参数的Python类实例?
问题描述
给定Python类:
class MyClassA(): def __init__(self, param_a, param_b): self.param_a = param_a self.param_b = param_b def my_method(self, param_c): return some_fun(self.param_a, self.param_b)
希望创建该类的实例时固定param_b的值,只需传入param_a即可,效果等同于显式定义子类:
class MyClassB(MyClassA): def __init__(self, param_a): super().__init__(param_a, something)
也就是实现my_obj_c = MyClassB(some_val)的效果,请问是否可以无需显式定义MyClassB,用一行代码直接实现?
需求背景
需要将该类用于仅支持单输入调用的流程,且要对param_b的多个不同值进行测试(如网格搜索),因此无法通过设置默认参数实现。
解决方案
当然可以,不用定义子类,有几种简洁的实现方式:
方法1:使用functools.partial
functools.partial能固定类构造函数的部分参数,返回一个新的可调用对象,传入剩余参数就能生成实例:
from functools import partial # 固定param_b为目标值,生成可调用对象 MyClassB = partial(MyClassA, param_b="something") # 仅传入param_a即可创建实例 my_obj_c = MyClassB("some_val")
方法2:使用lambda表达式
用lambda直接封装构造逻辑,固定param_b:
MyClassB = lambda param_a: MyClassA(param_a, "something") my_obj_c = MyClassB("some_val")
方法3:动态创建类(适合要求类类型的场景)
如果流程必须接收类而非可调用对象,用type动态生成子类,一行代码搞定:
MyClassB = type("MyClassB", (MyClassA,), {"__init__": lambda self, param_a: super().__init__(param_a, "something")}) my_obj_c = MyClassB("some_val")
前两种方法更简洁,尤其适合网格搜索场景——你可以快速为不同param_b值生成对应的可调用对象,直接适配单参数流程。
内容的提问来源于stack exchange,提问作者Eric Johnson
相关产品推荐
相关产品推荐

