Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多重继承超级初始化(**kwargs)_Python_Python 3.x - Fatal编程技术网

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
    ,因为
    初始化的对象是
    三个
    (这两个都知道)。