Python多重继承超级初始化(**kwargs)
我是新手,我有这样一个问题,在这个代码Python多重继承超级初始化(**kwargs),python,python-3.x,Python,Python 3.x,我是新手,我有这样一个问题,在这个代码 class One: def __init__(self, x, **kwargs): super().__init__(**kwargs) self.x = x**2 class Two: def __init__(self, y, **kwargs): super().__init__(**kwargs) self.y = y**3 class Three(One,
class One:
def __init__(self, x, **kwargs):
super().__init__(**kwargs)
self.x = x**2
class Two:
def __init__(self, y, **kwargs):
super().__init__(**kwargs)
self.y = y**3
class Three(One, Two):
def __init__(self, **kwargs):
super().__init__(**kwargs)
print(self.y, self.x)
Three(x=1, y=2)
我了解**kwargs的工作原理,但不明白为什么需要在中调用parents init函数
一班和二班。我在一班和二班看到**kwargs是空的 dict.如果kwargs只是空dict,为什么需要I super()。init(**kwargs) 我也尝试了另一种方法,没有kwargs
class Three(One, Two):
def __init__(self, x,y):
One.__init__(self,x)
Two.__init__(self,y)
print(self.y, self.x)
这种方式更容易理解,但有人能解释一下它是如何与**kwargs一起工作的吗。谢谢根据您的代码,您可以执行以下操作:
class Three(One, Two):
pass
除非你真的有一些特定的东西要在实例化的时候用三个步骤来实现
但是,您需要在两个父类上保留**kwarg,因为它们的\uuuuu init\uuu
将接收传递给三个类的所有未定义的关键字参数
建议:使用诸如PyCharm/VSCode之类的调试器来可视化创建实例时发生的事情,这非常有利于观察代码如何运行
super
只是让Python决定调用父类方法的顺序的一种方法(MRO)
当python执行Three(x=1,y=2)
时,它实际上发送给Three。init3件事:
self:正在实例化的实例
位置参数的元组(通常称为args
)
关键字args的dict(通常称为kwargs
)
在您的例子中,由于只使用关键字参数,args
将是一个空元组,而kwargs将是{'x':1,'y':2}
然后:
1.\uuuuu init\uuuuuuuuuuux,**kwargs)
将取x
并将y
留在kwargs内
2.\uuuuuuuuuu(y,**kwargs)
将取y
并将x
留在kwargs内
super
是一个误导性的名称。它按方法解析顺序调用下一个实现,而不是超类的实现。(“超类”在多重继承中甚至不是一个定义良好的概念。)试着打印它,你会发现它并不总是一个空字典。“在我的例子中,在类1和类2中,正如我所看到的**kwargs只是一个空字典。”你为什么这么认为?你测试过了吗?@KarlKnechtel我搜索了[python]super-kwargs
,这大约是第10个按相关性排序的结果。其余的都是相关的,只是距离不够近,无法复制。我发现在一个单独的选项卡中进行搜索比使用内置在“close as duplicate”(关闭为重复)对话框中的搜索要容易得多,而“close as duplicate”(关闭为重复)对话框很难使用?当我在第一类和第二类中打印(kwargs)时,它只是空的dict{},那么为什么需要用空的dict作为参数调用objects initial函数呢?“但是super()。uuuu init_uuu(**kwargs)做什么呢?”你试着把它复制并粘贴到搜索引擎中吗?“当我在一班和二班打印(kwargs)时,它只是空的dict{}”不,它不是。在One
中,您会得到一个y
键,因为它尚未分配给命名参数。super
调用允许将该信息传递给Two.\uuuu init\uuuuu
。super
magic的设计方式允许这种情况发生,即使One
不知道Two
,因为初始化的对象是三个(这两个都知道)。