【发布时间】:2021-03-23 22:56:34
【问题描述】:
我是新手,我有这样一个问题,在这段代码中
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 是如何工作的,但不明白为什么需要调用父母的 init 函数 第一和第二班。就我而言,在我看到的第一类和第二类的情况下,**kwargs 只是空的 字典。为什么需要我 super().init(**kwargs) ,如果 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 一起工作的。谢谢
【问题讨论】:
-
super是一个误导性名称。它调用方法解析顺序中的下一个实现,而不是超类的实现。 (“超类”在多重继承中甚至不是一个定义明确的概念。) -
尝试打印它,你会发现它并不总是一个空字典。
-
“在我的情况下,我在第一类和第二类中看到 **kwargs 只是空字典。”你为什么这么认为?你测试了吗?
-
@KarlKnechtel 我搜索了
[python] super kwargs,它大约是按相关性排序的第 10 个结果。其余的都是相关的,只是不够接近而不能重复。我发现在单独的选项卡中进行搜索要容易得多,而不是使用很难使用的“关闭为重复”对话框中内置的搜索。
标签: python python-3.x