【问题标题】:How to dynamically add arguments to class initialization?如何为类初始化动态添加参数?
【发布时间】:2021-05-05 16:10:25
【问题描述】:

我有一个主类和更多类,它们是主类的扩展。主类在其init中有两个参数,每个子类也使用这些参数+单独的参数

class Main:
    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2

class Child1(Main):
    def __init__(self, var1, var2, **kwargs):
        super().__init__(var1, var2)
        self.__dict__.update(kwargs)
        self.var3 = var3
        self.var4 = var4

class Child2(Main):
    def __init__(self, var1, var2, **kwargs):
        super().__init__(var1, var2)
        self.__dict__.update(kwargs)
        self.var5 = var5

我希望能够通过传递Child1(var1 = 1, var2 = 2, var3 = 3, var4 = 4)Child2(var1 = 1, var2 = 2, var5 = 5) 等实际值迭代地初始化子类,但实际上不必手动输入它们。理想情况下,我可以遍历存储如下值的字典:

my_dict = {'Child1': {'var3': 3, 'var4': 4}, 'Child2': {'var5': 5}}

请注意,我只想像这样传递特定于类的变量。最后,我想要这样的东西:

var1 = [1, 2, 3, 4]
var2 = [1, 2]
for x,y, (k,v) in product(var1, var2, my_dict.items()):
    v(var1 = x, var2 = y, $fill missing keyword arguments in here that are specific to child class$)

【问题讨论】:

  • 如果您发现自己正在寻找像这样强有力的解决方案来解决问题,那么您几乎总是最好重新考虑您的设计。这听起来像您可能在应该使用组合的地方滥用继承。
  • @Woodford 如果您有任何建议,我愿意接受。我如何将其更改为组合?
  • 无法从您的帖子中看出。你只描述了做什么你想做什么,而不是为什么
  • 我希望能够初始化所有子类,以便稍后调用它们。

标签: python class for-loop initialization


【解决方案1】:

我实际上能够自己解决这个问题。我能够在 my_dict 上使用解包来动态填充缺失的参数。

**for x,y, (k,v) in product(var1, var2, my_dict.items()):
    v(var1 = x, var2 = y, **v)

【讨论】:

    猜你喜欢
    • 2019-03-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2016-01-04
    相关资源
    最近更新 更多