<p>我会跳过<code>DEFAULTS</code>这句话,因为这是不必要的膨胀。如果您真的需要访问这些参数的默认值,可以通过内省<code>__init__</code>方法来获取它们。否则,使用<code>super</code>的一般规则是去掉类特有的参数,并将所有其他参数传递给下一个对<code>__init__</code>的调用。在</p>
<p>类设计器的责任是确保在调用<code>object.__init__</code>之前,结果MRO中的任何类删除<code>__init__</code>的所有参数。在下面的示例中,<code>Parent.__init__</code>将使用实际参数调用<code>object.__init__</code>的唯一方法是,<code>self</code>的MRO中的某个<em>其他</em>类未能删除其参数。在</p>
<pre><code>class Parent(object):
def __init__(self, p_var_1="my name", p_var_2=2, **kwargs):
super().__init__(**kwargs)
self.p_var_1 = p_var_1
self.p_var_2 = p_var_2
class Gen1(Parent): #should have p_var and G1_var fields
def __init__(self, g1_var_1="Generation 1", g1_var_2=None, **kwargs):
super().__init__(**kwargs)
if g1_var_2 is None:
g1_var_2 = []
self.g1_var_1 = g1_var_1
self.g1_var_2 = g1_var_2
class Gen2(Gen1): #should have p_var, G1_var and G2_var fields
def __init__(self, g2_var_1=1337, g2_var_2=(10,4), **kwargs):
super().__init__(**kwargs)
self.g2_var_1 = g2_var_1
self.g2_var_2 = g2_var_2
</code></pre>
<p>考虑打个电话</p>
^{pr2}$
<p>第一个调用的方法是<code>Gen2.__init__</code>,它只将<code>p</code>和{<cd12>}变量传递给<code>super.__init__</code>。该调用导致对<code>Gen1.__init__</code>的调用,该调用只传递<code>p</code>个变量。调用<code>Parent.__init__</code>时,<code>**kwargs</code>为空。在</p>