给定一个简单的类:
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
。
即像这样的东西:
class MyClassB(MyClassA):
def __init__(self, param_a):
super().__init__(param_a, something)
现在我想要:
my_obj_c = MyClassB(some_val)
.
问题是,有没有办法在一个班轮中获得
my_obj_c
而无需明确构建MyClassB
?
我需要这个的原因实际上是这个类被一个不同的过程使用,它支持用一个输入调用这个类。
我想要的是尝试它(如网格搜索),它有许多不同的
param_b
值。这就是为什么设置默认值不会这样做的原因。
你怎么看
class MyClassA():
def __init__(self, param_a, param_b=SomeValue):
...
这样你就可以像这样创建实例:
obj1 = MyClassA(param_a, param_b)
obj2 = MyClassA(param_a)
在第二个实例中,param_b 将是 someValue
您可以使用 functools.partial 来制作带有第二个预设参数的类构造函数的一部分。
import functools
class MyClassA():
def __init__(self, param_a, param_b):
self.param_a = param_a
self.param_b = param_b
def my_method(self):
return f"{self.param_a} {self.param_b}"
Paramterized = functools.partial(MyClassA, param_b="world")
my_instance = Paramterized("hello")
# <__main__.MyClassA at 0x112816e00>
my_instance.my_method()
#'hello world'
my_instance2 = Paramterized("goodbye cruel")
my_instance2.my_method()
# 'goodbye cruel world'