我可以将 python **kwargs 从 sub 传递给父类吗?

Posted

技术标签:

【中文标题】我可以将 python **kwargs 从 sub 传递给父类吗?【英文标题】:Can I pass python **kwargs to parent class from sub? 【发布时间】:2012-12-29 01:38:43 【问题描述】:

我想做这样的事情:

class A(object):
    def __init__(self, **kwargs):
       """ 
       return exception if certain arguments not set
       """

class B(A):
    def __init__(self, **kwargs):
       super(B, self).__init__(**kwargs)

基本上,每个子类都需要正确实例化某些参数。它们在所有方面都是相同的参数。我只想检查这些参数一次。如果我可以从父 init() 执行此操作,那就更好了。

可以这样做吗?

【问题讨论】:

【参考方案1】:

当然。这种模式并不少见:

class A(object):
    def __init__(self, foo, bar=3):
        self.foo = foo
        self.bar = bar

class B(A):
    def __init__(self, quux=6, **kwargs):
        super(B, self).__init__(**kwargs)

        self.quux = quux

B(foo=1, quux=4)

这也使您与super shenanigans 有所隔离:现在A 的argspec 可以更改而无需对B 进行任何编辑,并且钻石继承不太可能中断。

【讨论】:

请注意,您可以用A(1,3) 实例化A 对象,但不能用B(1,3) 甚至B(1,3,4) 实例化B 对象【参考方案2】:

当然。当输入参数和关键字参数时,参数和关键字扩展将自然地起作用。

【讨论】:

以上是关于我可以将 python **kwargs 从 sub 传递给父类吗?的主要内容,如果未能解决你的问题,请参考以下文章

*args和**kwargs在python中的作用

如何将定义的字典传递给 Python 中的 **kwargs?

Python中将dict转换为kwargs

python *args 与 **kwargs

Python - *args和**kwargs的区别

Python3中参数*args和**kwargs介绍